fix(mandate): only trigger mandate procedure on successful connector call (#1122)

This commit is contained in:
Nishant Joshi
2023-05-11 16:38:38 +05:30
committed by GitHub
parent f70f10aac5
commit a904d2b4d9

View File

@ -134,82 +134,85 @@ pub async fn mandate_procedure<F, FData>(
where where
FData: MandateBehaviour, FData: MandateBehaviour,
{ {
match resp.request.get_mandate_id() { match resp.response {
Some(mandate_id) => { Err(_) => {}
let mandate_id = &mandate_id.mandate_id; Ok(_) => match resp.request.get_mandate_id() {
let mandate = state Some(mandate_id) => {
.store let mandate_id = &mandate_id.mandate_id;
.find_mandate_by_merchant_id_mandate_id(resp.merchant_id.as_ref(), mandate_id) let mandate = state
.await
.change_context(errors::ApiErrorResponse::MandateNotFound)?;
let mandate = match mandate.mandate_type {
storage_enums::MandateType::SingleUse => state
.store .store
.update_mandate_by_merchant_id_mandate_id( .find_mandate_by_merchant_id_mandate_id(resp.merchant_id.as_ref(), mandate_id)
&resp.merchant_id,
mandate_id,
storage::MandateUpdate::StatusUpdate {
mandate_status: storage_enums::MandateStatus::Revoked,
},
)
.await .await
.change_context(errors::ApiErrorResponse::MandateUpdateFailed), .change_context(errors::ApiErrorResponse::MandateNotFound)?;
storage_enums::MandateType::MultiUse => state let mandate = match mandate.mandate_type {
.store storage_enums::MandateType::SingleUse => state
.update_mandate_by_merchant_id_mandate_id( .store
&resp.merchant_id, .update_mandate_by_merchant_id_mandate_id(
mandate_id, &resp.merchant_id,
storage::MandateUpdate::CaptureAmountUpdate { mandate_id,
amount_captured: Some( storage::MandateUpdate::StatusUpdate {
mandate.amount_captured.unwrap_or(0) + resp.request.get_amount(), mandate_status: storage_enums::MandateStatus::Revoked,
), },
}, )
) .await
.await .change_context(errors::ApiErrorResponse::MandateUpdateFailed),
.change_context(errors::ApiErrorResponse::MandateUpdateFailed), storage_enums::MandateType::MultiUse => state
}?; .store
metrics::SUBSEQUENT_MANDATE_PAYMENT.add( .update_mandate_by_merchant_id_mandate_id(
&metrics::CONTEXT, &resp.merchant_id,
1, mandate_id,
&[metrics::request::add_attributes( storage::MandateUpdate::CaptureAmountUpdate {
"connector", amount_captured: Some(
mandate.connector, mandate.amount_captured.unwrap_or(0)
)], + resp.request.get_amount(),
); ),
resp.payment_method_id = Some(mandate.payment_method_id); },
} )
None => { .await
if resp.request.get_setup_mandate_details().is_some() { .change_context(errors::ApiErrorResponse::MandateUpdateFailed),
resp.payment_method_id = pm_id.clone(); }?;
let (mandate_reference, network_txn_id) = match resp.response.as_ref().ok() { metrics::SUBSEQUENT_MANDATE_PAYMENT.add(
Some(types::PaymentsResponseData::TransactionResponse { &metrics::CONTEXT,
mandate_reference, 1,
&[metrics::request::add_attributes(
"connector",
mandate.connector,
)],
);
resp.payment_method_id = Some(mandate.payment_method_id);
}
None => {
if resp.request.get_setup_mandate_details().is_some() {
resp.payment_method_id = pm_id.clone();
let (mandate_reference, network_txn_id) = match resp.response.as_ref().ok() {
Some(types::PaymentsResponseData::TransactionResponse {
mandate_reference,
network_txn_id,
..
}) => (mandate_reference.clone(), network_txn_id.clone()),
_ => (None, None),
};
let mandate_ids = mandate_reference
.map(|md| {
Encode::<types::MandateReference>::encode_to_value(&md)
.change_context(errors::ApiErrorResponse::MandateNotFound)
.map(masking::Secret::new)
})
.transpose()?;
if let Some(new_mandate_data) = helpers::generate_mandate(
resp.merchant_id.clone(),
resp.connector.clone(),
resp.request.get_setup_mandate_details().map(Clone::clone),
maybe_customer,
pm_id.get_required_value("payment_method_id")?,
mandate_ids,
network_txn_id, network_txn_id,
.. ) {
}) => (mandate_reference.clone(), network_txn_id.clone()), let connector = new_mandate_data.connector.clone();
_ => (None, None), logger::debug!("{:?}", new_mandate_data);
}; resp.request
let mandate_ids = mandate_reference
.map(|md| {
Encode::<types::MandateReference>::encode_to_value(&md)
.change_context(errors::ApiErrorResponse::MandateNotFound)
.map(masking::Secret::new)
})
.transpose()?;
if let Some(new_mandate_data) = helpers::generate_mandate(
resp.merchant_id.clone(),
resp.connector.clone(),
resp.request.get_setup_mandate_details().map(Clone::clone),
maybe_customer,
pm_id.get_required_value("payment_method_id")?,
mandate_ids,
network_txn_id,
) {
let connector = new_mandate_data.connector.clone();
logger::debug!("{:?}", new_mandate_data);
resp.request
.set_mandate_id(Some(api_models::payments::MandateIds { .set_mandate_id(Some(api_models::payments::MandateIds {
mandate_id: new_mandate_data.mandate_id.clone(), mandate_id: new_mandate_data.mandate_id.clone(),
mandate_reference_id: new_mandate_data mandate_reference_id: new_mandate_data
@ -236,21 +239,23 @@ where
} }
))) )))
})); }));
state state
.store .store
.insert_mandate(new_mandate_data) .insert_mandate(new_mandate_data)
.await .await
.to_duplicate_response(errors::ApiErrorResponse::DuplicateRefundRequest)?; .to_duplicate_response(
metrics::MANDATE_COUNT.add( errors::ApiErrorResponse::DuplicateRefundRequest,
&metrics::CONTEXT, )?;
1, metrics::MANDATE_COUNT.add(
&[metrics::request::add_attributes("connector", connector)], &metrics::CONTEXT,
); 1,
}; &[metrics::request::add_attributes("connector", connector)],
);
};
}
} }
} },
} }
Ok(resp) Ok(resp)
} }