diff --git a/crates/router/src/connector/rapyd.rs b/crates/router/src/connector/rapyd.rs index 292e6c55f2..29f21f3738 100644 --- a/crates/router/src/connector/rapyd.rs +++ b/crates/router/src/connector/rapyd.rs @@ -64,6 +64,10 @@ impl ConnectorCommon for Rapyd { "rapyd" } + fn get_currency_unit(&self) -> api::CurrencyUnit { + api::CurrencyUnit::Minor + } + fn common_get_content_type(&self) -> &'static str { "application/json" } @@ -179,7 +183,13 @@ impl &self, req: &types::PaymentsAuthorizeRouterData, ) -> CustomResult, errors::ConnectorError> { - let req_obj = rapyd::RapydPaymentsRequest::try_from(req)?; + let connector_router_data = rapyd::RapydRouterData::try_from(( + &self.get_currency_unit(), + req.request.currency, + req.request.amount, + req, + ))?; + let req_obj = rapyd::RapydPaymentsRequest::try_from(&connector_router_data)?; let rapyd_req = types::RequestBody::log_and_get_request_body( &req_obj, utils::Encode::::encode_to_string_of_json, @@ -483,7 +493,13 @@ impl &self, req: &types::PaymentsCaptureRouterData, ) -> CustomResult, errors::ConnectorError> { - let req_obj = rapyd::CaptureRequest::try_from(req)?; + let connector_router_data = rapyd::RapydRouterData::try_from(( + &self.get_currency_unit(), + req.request.currency, + req.request.amount_to_capture, + req, + ))?; + let req_obj = rapyd::CaptureRequest::try_from(&connector_router_data)?; let rapyd_req = types::RequestBody::log_and_get_request_body( &req_obj, utils::Encode::::encode_to_string_of_json, @@ -615,7 +631,13 @@ impl services::ConnectorIntegration, ) -> CustomResult, errors::ConnectorError> { - let req_obj = rapyd::RapydRefundRequest::try_from(req)?; + let connector_router_data = rapyd::RapydRouterData::try_from(( + &self.get_currency_unit(), + req.request.currency, + req.request.refund_amount, + req, + ))?; + let req_obj = rapyd::RapydRefundRequest::try_from(&connector_router_data)?; let rapyd_req = types::RequestBody::log_and_get_request_body( &req_obj, utils::Encode::::encode_to_string_of_json, diff --git a/crates/router/src/connector/rapyd/transformers.rs b/crates/router/src/connector/rapyd/transformers.rs index 79ad6838ac..9df699b938 100644 --- a/crates/router/src/connector/rapyd/transformers.rs +++ b/crates/router/src/connector/rapyd/transformers.rs @@ -13,6 +13,36 @@ use crate::{ utils::OptionExt, }; +#[derive(Debug, Serialize)] +pub struct RapydRouterData { + pub amount: i64, + pub router_data: T, +} + +impl + TryFrom<( + &types::api::CurrencyUnit, + types::storage::enums::Currency, + i64, + T, + )> for RapydRouterData +{ + type Error = error_stack::Report; + fn try_from( + (_currency_unit, _currency, amount, item): ( + &types::api::CurrencyUnit, + types::storage::enums::Currency, + i64, + T, + ), + ) -> Result { + Ok(Self { + amount, + router_data: item, + }) + } +} + #[derive(Default, Debug, Serialize)] pub struct RapydPaymentsRequest { pub amount: i64, @@ -69,18 +99,23 @@ pub struct RapydWallet { token: Option, } -impl TryFrom<&types::PaymentsAuthorizeRouterData> for RapydPaymentsRequest { +impl TryFrom<&RapydRouterData<&types::PaymentsAuthorizeRouterData>> for RapydPaymentsRequest { type Error = error_stack::Report; - fn try_from(item: &types::PaymentsAuthorizeRouterData) -> Result { - let (capture, payment_method_options) = match item.payment_method { + fn try_from( + item: &RapydRouterData<&types::PaymentsAuthorizeRouterData>, + ) -> Result { + let (capture, payment_method_options) = match item.router_data.payment_method { diesel_models::enums::PaymentMethod::Card => { - let three_ds_enabled = matches!(item.auth_type, enums::AuthenticationType::ThreeDs); + let three_ds_enabled = matches!( + item.router_data.auth_type, + enums::AuthenticationType::ThreeDs + ); let payment_method_options = PaymentMethodOptions { three_ds: three_ds_enabled, }; ( Some(matches!( - item.request.capture_method, + item.router_data.request.capture_method, Some(enums::CaptureMethod::Automatic) | None )), Some(payment_method_options), @@ -88,7 +123,7 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for RapydPaymentsRequest { } _ => (None, None), }; - let payment_method = match item.request.payment_method_data { + let payment_method = match item.router_data.request.payment_method_data { api_models::payments::PaymentMethodData::Card(ref ccard) => { Some(PaymentMethod { pm_type: "in_amex_card".to_owned(), //[#369] Map payment method type based on country @@ -128,10 +163,10 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for RapydPaymentsRequest { .change_context(errors::ConnectorError::NotImplemented( "payment_method".to_owned(), ))?; - let return_url = item.request.get_return_url()?; + let return_url = item.router_data.request.get_return_url()?; Ok(Self { - amount: item.request.amount, - currency: item.request.currency, + amount: item.amount, + currency: item.router_data.request.currency, payment_method, capture, payment_method_options, @@ -276,13 +311,17 @@ pub struct RapydRefundRequest { pub currency: Option, } -impl TryFrom<&types::RefundsRouterData> for RapydRefundRequest { +impl TryFrom<&RapydRouterData<&types::RefundsRouterData>> for RapydRefundRequest { type Error = error_stack::Report; - fn try_from(item: &types::RefundsRouterData) -> Result { + fn try_from(item: &RapydRouterData<&types::RefundsRouterData>) -> Result { Ok(Self { - payment: item.request.connector_transaction_id.to_string(), - amount: Some(item.request.refund_amount), - currency: Some(item.request.currency), + payment: item + .router_data + .request + .connector_transaction_id + .to_string(), + amount: Some(item.amount), + currency: Some(item.router_data.request.currency), }) } } @@ -380,11 +419,13 @@ pub struct CaptureRequest { statement_descriptor: Option, } -impl TryFrom<&types::PaymentsCaptureRouterData> for CaptureRequest { +impl TryFrom<&RapydRouterData<&types::PaymentsCaptureRouterData>> for CaptureRequest { type Error = error_stack::Report; - fn try_from(item: &types::PaymentsCaptureRouterData) -> Result { + fn try_from( + item: &RapydRouterData<&types::PaymentsCaptureRouterData>, + ) -> Result { Ok(Self { - amount: Some(item.request.amount_to_capture), + amount: Some(item.amount), receipt_email: None, statement_descriptor: None, })