diff --git a/crates/router/src/connector/airwallex.rs b/crates/router/src/connector/airwallex.rs index 8a22c14dd320..8ef7ba08211e 100644 --- a/crates/router/src/connector/airwallex.rs +++ b/crates/router/src/connector/airwallex.rs @@ -66,6 +66,10 @@ impl ConnectorCommon for Airwallex { "airwallex" } + fn get_currency_unit(&self) -> api::CurrencyUnit { + api::CurrencyUnit::Base + } + fn common_get_content_type(&self) -> &'static str { "application/json" } @@ -369,7 +373,13 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { - let connector_req = airwallex::AirwallexPaymentsRequest::try_from(req)?; + let connector_router_data = airwallex::AirwallexRouterData::try_from(( + &self.get_currency_unit(), + req.request.currency, + req.request.amount, + req, + ))?; + let connector_req = airwallex::AirwallexPaymentsRequest::try_from(&connector_router_data)?; let airwallex_req = types::RequestBody::log_and_get_request_body( &connector_req, utils::Encode::::encode_to_string_of_json, @@ -810,7 +820,13 @@ impl ConnectorIntegration, ) -> CustomResult, errors::ConnectorError> { - let connector_req = airwallex::AirwallexRefundRequest::try_from(req)?; + let connector_router_data = airwallex::AirwallexRouterData::try_from(( + &self.get_currency_unit(), + req.request.currency, + req.request.refund_amount, + req, + ))?; + let connector_req = airwallex::AirwallexRefundRequest::try_from(&connector_router_data)?; let airwallex_req = types::RequestBody::log_and_get_request_body( &connector_req, utils::Encode::::encode_to_string_of_json, diff --git a/crates/router/src/connector/airwallex/transformers.rs b/crates/router/src/connector/airwallex/transformers.rs index 3343f41c554e..51258643c64c 100644 --- a/crates/router/src/connector/airwallex/transformers.rs +++ b/crates/router/src/connector/airwallex/transformers.rs @@ -53,6 +53,38 @@ impl TryFrom<&types::PaymentsInitRouterData> for AirwallexIntentRequest { } } +#[derive(Debug, Serialize)] +pub struct AirwallexRouterData { + pub amount: String, + pub router_data: T, +} + +impl + TryFrom<( + &types::api::CurrencyUnit, + types::storage::enums::Currency, + i64, + T, + )> for AirwallexRouterData +{ + type Error = error_stack::Report; + + fn try_from( + (currency_unit, currency, amount, router_data): ( + &types::api::CurrencyUnit, + types::storage::enums::Currency, + i64, + T, + ), + ) -> Result { + let amount = utils::get_amount_as_string(currency_unit, amount, currency)?; + Ok(Self { + amount, + router_data, + }) + } +} + #[derive(Debug, Serialize)] pub struct AirwallexPaymentsRequest { // Unique ID to be sent for each transaction/operation request to the connector @@ -125,16 +157,21 @@ pub struct AirwallexCardPaymentOptions { auto_capture: bool, } -impl TryFrom<&types::PaymentsAuthorizeRouterData> for AirwallexPaymentsRequest { +impl TryFrom<&AirwallexRouterData<&types::PaymentsAuthorizeRouterData>> + for AirwallexPaymentsRequest +{ type Error = error_stack::Report; - fn try_from(item: &types::PaymentsAuthorizeRouterData) -> Result { + fn try_from( + item: &AirwallexRouterData<&types::PaymentsAuthorizeRouterData>, + ) -> Result { let mut payment_method_options = None; - let payment_method = match item.request.payment_method_data.clone() { + let request = &item.router_data.request; + let payment_method = match request.payment_method_data.clone() { api::PaymentMethodData::Card(ccard) => { payment_method_options = Some(AirwallexPaymentOptions::Card(AirwallexCardPaymentOptions { auto_capture: matches!( - item.request.capture_method, + request.capture_method, Some(enums::CaptureMethod::Automatic) | None ), })); @@ -158,7 +195,7 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for AirwallexPaymentsRequest { request_id: Uuid::new_v4().to_string(), payment_method, payment_method_options, - return_url: item.request.complete_authorize_url.clone(), + return_url: request.complete_authorize_url.clone(), }) } } @@ -538,17 +575,16 @@ pub struct AirwallexRefundRequest { payment_intent_id: String, } -impl TryFrom<&types::RefundsRouterData> for AirwallexRefundRequest { +impl TryFrom<&AirwallexRouterData<&types::RefundsRouterData>> for AirwallexRefundRequest { type Error = error_stack::Report; - fn try_from(item: &types::RefundsRouterData) -> Result { + fn try_from( + item: &AirwallexRouterData<&types::RefundsRouterData>, + ) -> Result { Ok(Self { request_id: Uuid::new_v4().to_string(), - amount: Some(utils::to_currency_base_unit( - item.request.refund_amount, - item.request.currency, - )?), - reason: item.request.reason.clone(), - payment_intent_id: item.request.connector_transaction_id.clone(), + amount: Some(item.amount.to_owned()), + reason: item.router_data.request.reason.clone(), + payment_intent_id: item.router_data.request.connector_transaction_id.clone(), }) } }