Skip to content

Commit

Permalink
refactor(core): Status mapping for Capture for 429 http code (#3901)
Browse files Browse the repository at this point in the history
  • Loading branch information
Sakilmostak authored Mar 1, 2024
1 parent 0b6c2ff commit 0ddf1bf
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 26 deletions.
60 changes: 34 additions & 26 deletions crates/router/src/connector/payme.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ use std::fmt::Debug;
use api_models::enums::AuthenticationType;
use common_utils::{crypto, request::RequestContent};
use diesel_models::enums;
use error_stack::{IntoReport, ResultExt};
use error_stack::{IntoReport, Report, ResultExt};
use masking::ExposeInterface;
use transformers as payme;

use crate::{
configs::settings,
connector::{utils as connector_utils, utils::PaymentsPreProcessingData},
connector::utils::{self as connector_utils, PaymentsPreProcessingData},
core::{
errors::{self, CustomResult},
payments,
Expand All @@ -24,7 +24,7 @@ use crate::{
api::{self, ConnectorCommon, ConnectorCommonExt},
domain, ErrorResponse, Response,
},
utils::BytesExt,
utils::{handle_json_response_deserialization_failure, BytesExt},
};

#[derive(Debug, Clone)]
Expand Down Expand Up @@ -83,29 +83,37 @@ impl ConnectorCommon for Payme {
res: Response,
event_builder: Option<&mut ConnectorEvent>,
) -> CustomResult<ErrorResponse, errors::ConnectorError> {
let response: payme::PaymeErrorResponse =
res.response
.parse_struct("PaymeErrorResponse")
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;

event_builder.map(|i| i.set_error_response_body(&response));
router_env::logger::info!(connector_response=?response);

let status_code = match res.status_code {
500..=511 => 200,
_ => res.status_code,
};
Ok(ErrorResponse {
status_code,
code: response.status_error_code.to_string(),
message: response.status_error_details.clone(),
reason: Some(format!(
"{}, additional info: {}",
response.status_error_details, response.status_additional_info
)),
attempt_status: None,
connector_transaction_id: None,
})
let response: Result<
payme::PaymeErrorResponse,
Report<common_utils::errors::ParsingError>,
> = res.response.parse_struct("PaymeErrorResponse");

match response {
Ok(response_data) => {
event_builder.map(|i| i.set_error_response_body(&response_data));
router_env::logger::info!(connector_response=?response_data);
let status_code = match res.status_code {
500..=511 => 200,
_ => res.status_code,
};
Ok(ErrorResponse {
status_code,
code: response_data.status_error_code.to_string(),
message: response_data.status_error_details.clone(),
reason: Some(format!(
"{}, additional info: {}",
response_data.status_error_details, response_data.status_additional_info
)),
attempt_status: None,
connector_transaction_id: None,
})
}
Err(error_msg) => {
event_builder.map(|event| event.set_error(serde_json::json!({"error": res.response.escape_ascii().to_string(), "status_code": res.status_code})));
router_env::logger::error!(deserialization_error =? error_msg);
handle_json_response_deserialization_failure(res, "payme".to_owned())
}
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,13 @@ async fn payment_response_update_tracker<F: Clone, T: types::Capturable>(
200..=299 => storage::enums::AttemptStatus::Failure,
_ => router_data.status,
}
} else if flow_name == "Capture" {
match err.status_code {
500..=511 => storage::enums::AttemptStatus::Pending,
// don't update the status for 429 error status
429 => router_data.status,
_ => storage::enums::AttemptStatus::Failure,
}
} else {
match err.status_code {
500..=511 => storage::enums::AttemptStatus::Pending,
Expand Down

0 comments on commit 0ddf1bf

Please sign in to comment.