refactor(refunds): refactor refunds create to check for unintended 5xx (#1332)

Co-authored-by: Nitesh Balla <nitesh.balla@juspay.in>
Co-authored-by: Arun Raj M <jarnura47@gmail.com>
This commit is contained in:
Abhishek Marrivagu
2023-06-23 15:46:18 +05:30
committed by GitHub
parent 6ec6272f2a
commit ff17b62dc2
2 changed files with 23 additions and 23 deletions

View File

@ -45,7 +45,7 @@ pub async fn refund_create_core(
merchant_account.storage_scheme,
)
.await
.change_context(errors::ApiErrorResponse::PaymentNotFound)?;
.to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?;
utils::when(
payment_intent.status != enums::IntentStatus::Succeeded,
@ -55,7 +55,7 @@ pub async fn refund_create_core(
},
)?;
// Amount is not passed in request refer from payment attempt.
// Amount is not passed in request refer from payment intent.
amount = req.amount.unwrap_or(
payment_intent
.amount_captured
@ -63,13 +63,14 @@ pub async fn refund_create_core(
.into_report()
.attach_printable("amount captured is none in a successful payment")?,
);
//[#299]: Can we change the flow based on some workflow idea
utils::when(amount <= 0, || {
Err(report!(errors::ApiErrorResponse::InvalidDataFormat {
field_name: "amount".to_string(),
expected_format: "positive integer".to_string()
})
.attach_printable("amount less than zero"))
.attach_printable("amount less than or equal to zero"))
})?;
payment_attempt = db
@ -79,7 +80,7 @@ pub async fn refund_create_core(
merchant_account.storage_scheme,
)
.await
.change_context(errors::ApiErrorResponse::SuccessfulPaymentNotFound)?;
.to_not_found_response(errors::ApiErrorResponse::SuccessfulPaymentNotFound)?;
let creds_identifier = req
.merchant_connector_details
@ -142,15 +143,12 @@ pub async fn trigger_refund_to_gateway(
&state.conf.connectors,
&routed_through,
api::GetToken::Connector,
)
.change_context(errors::ApiErrorResponse::InternalServerError)
.attach_printable("Failed to get the connector")?;
)?;
let currency = payment_attempt.currency.ok_or_else(|| {
report!(errors::ApiErrorResponse::MissingRequiredField {
field_name: "currency"
})
.attach_printable("Transaction in invalid")
report!(errors::ApiErrorResponse::InternalServerError).attach_printable(
"Transaction in invalid. Missing field \"currency\" in payment_attempt.",
)
})?;
validator::validate_for_valid_refunds(payment_attempt, connector.connector_name)?;
@ -236,7 +234,7 @@ pub async fn trigger_refund_to_gateway(
merchant_account.storage_scheme,
)
.await
.change_context(errors::ApiErrorResponse::InternalServerError)
.to_not_found_response(errors::ApiErrorResponse::InternalServerError)
.attach_printable_lazy(|| {
format!(
"Failed while updating refund: refund_id: {}",
@ -307,7 +305,7 @@ pub async fn refund_retrieve_core(
merchant_account.storage_scheme,
)
.await
.to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?;
.to_not_found_response(errors::ApiErrorResponse::InternalServerError)?;
let creds_identifier = request
.merchant_connector_details
@ -451,7 +449,7 @@ pub async fn sync_refund_with_gateway(
merchant_account.storage_scheme,
)
.await
.change_context(errors::ApiErrorResponse::InternalServerError)
.to_not_found_response(errors::ApiErrorResponse::RefundNotFound)
.attach_printable_lazy(|| {
format!(
"Unable to update refund with refund_id: {}",
@ -548,20 +546,19 @@ pub async fn validate_and_create_refund(
})? {
Some(refund) => refund,
None => {
let connecter_transaction_id = match &payment_attempt.connector_transaction_id {
Some(id) => id,
None => "",
};
let connecter_transaction_id = payment_attempt.clone().connector_transaction_id.ok_or_else(|| {
report!(errors::ApiErrorResponse::InternalServerError)
.attach_printable("Transaction in invalid. Missing field \"connector_transaction_id\" in payment_attempt.")
})?;
all_refunds = db
.find_refund_by_merchant_id_connector_transaction_id(
&merchant_account.merchant_id,
connecter_transaction_id,
&connecter_transaction_id,
merchant_account.storage_scheme,
)
.await
.change_context(errors::ApiErrorResponse::RefundNotFound)
.attach_printable("Failed to fetch refund")?;
.to_not_found_response(errors::ApiErrorResponse::RefundNotFound)?;
currency = payment_attempt.currency.get_required_value("currency")?;
//[#249]: Add Connector Based Validation here.
@ -618,6 +615,7 @@ pub async fn validate_and_create_refund(
.insert_refund(refund_create_req, merchant_account.storage_scheme)
.await
.to_duplicate_response(errors::ApiErrorResponse::DuplicateRefundRequest)?;
schedule_refund_execution(
state,
refund,
@ -715,6 +713,7 @@ pub async fn schedule_refund_execution(
.await
.change_context(errors::ApiErrorResponse::InternalServerError)
.attach_printable("Failed to find the process id")?;
let result = match refund.refund_status {
enums::RefundStatus::Pending | enums::RefundStatus::ManualReview => {
match (refund.sent_to_gateway, refund_process) {

View File

@ -58,7 +58,8 @@ pub async fn construct_refund_router_data<'a, F>(
let payment_method_type = payment_attempt
.payment_method
.get_required_value("payment_method_type")?;
.get_required_value("payment_method_type")
.change_context(errors::ApiErrorResponse::InternalServerError)?;
let webhook_url = Some(helpers::create_webhook_url(
&state.conf.server.base_url.clone(),