From 91146de2a2bc684998023535e56dee1af92fda76 Mon Sep 17 00:00:00 2001 From: Gaurav Ghodinde <65962770+gauravghodinde@users.noreply.github.com> Date: Fri, 18 Oct 2024 18:51:54 +0530 Subject: [PATCH] refactor(connector): add amount conversion framework to opayo (#6342) Co-authored-by: DEEPANSHU BANSAL <41580413+deepanshu-iiitu@users.noreply.github.com> --- crates/router/src/connector/opayo.rs | 39 +++++++++++++++---- .../src/connector/opayo/transformers.rs | 34 ++++++++++++---- crates/router/tests/connectors/opayo.rs | 2 +- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/crates/router/src/connector/opayo.rs b/crates/router/src/connector/opayo.rs index cd1ef67f66..3e7edba212 100644 --- a/crates/router/src/connector/opayo.rs +++ b/crates/router/src/connector/opayo.rs @@ -1,8 +1,9 @@ mod transformers; -use std::fmt::Debug; - -use common_utils::request::RequestContent; +use common_utils::{ + request::RequestContent, + types::{AmountConvertor, MinorUnit, MinorUnitForConnector}, +}; use diesel_models::enums; use error_stack::{report, ResultExt}; use masking::ExposeInterface; @@ -10,7 +11,7 @@ use transformers as opayo; use crate::{ configs::settings, - connector::utils as connector_utils, + connector::{utils as connector_utils, utils::convert_amount}, core::errors::{self, CustomResult}, events::connector_api_logs::ConnectorEvent, headers, @@ -27,8 +28,18 @@ use crate::{ utils::BytesExt, }; -#[derive(Debug, Clone)] -pub struct Opayo; +#[derive(Clone)] +pub struct Opayo { + amount_converter: &'static (dyn AmountConvertor + Sync), +} + +impl Opayo { + pub fn new() -> &'static Self { + &Self { + amount_converter: &MinorUnitForConnector, + } + } +} impl api::Payment for Opayo {} impl api::PaymentSession for Opayo {} @@ -197,7 +208,13 @@ impl ConnectorIntegration CustomResult { - let connector_req = opayo::OpayoPaymentsRequest::try_from(req)?; + let amount = convert_amount( + self.amount_converter, + req.request.minor_amount, + req.request.currency, + )?; + let connector_router_data = opayo::OpayoRouterData::from((amount, req)); + let connector_req = opayo::OpayoPaymentsRequest::try_from(&connector_router_data)?; Ok(RequestContent::Json(Box::new(connector_req))) } @@ -433,7 +450,13 @@ impl ConnectorIntegration, _connectors: &settings::Connectors, ) -> CustomResult { - let connector_req = opayo::OpayoRefundRequest::try_from(req)?; + let refund_amount = convert_amount( + self.amount_converter, + req.request.minor_refund_amount, + req.request.currency, + )?; + let connector_router_data = opayo::OpayoRouterData::from((refund_amount, req)); + let connector_req = opayo::OpayoRefundRequest::try_from(&connector_router_data)?; Ok(RequestContent::Json(Box::new(connector_req))) } diff --git a/crates/router/src/connector/opayo/transformers.rs b/crates/router/src/connector/opayo/transformers.rs index 16a76301ed..44069f3650 100644 --- a/crates/router/src/connector/opayo/transformers.rs +++ b/crates/router/src/connector/opayo/transformers.rs @@ -1,3 +1,4 @@ +use common_utils::types::MinorUnit; use masking::Secret; use serde::{Deserialize, Serialize}; @@ -6,10 +7,24 @@ use crate::{ core::errors, types::{self, api, domain, storage::enums}, }; +#[derive(Debug, Serialize)] +pub struct OpayoRouterData { + pub amount: MinorUnit, + pub router_data: T, +} + +impl From<(MinorUnit, T)> for OpayoRouterData { + fn from((amount, router_data): (MinorUnit, T)) -> Self { + Self { + amount, + router_data, + } + } +} #[derive(Default, Debug, Serialize, Eq, PartialEq)] pub struct OpayoPaymentsRequest { - amount: i64, + amount: MinorUnit, card: OpayoCard, } @@ -23,9 +38,12 @@ pub struct OpayoCard { complete: bool, } -impl TryFrom<&types::PaymentsAuthorizeRouterData> for OpayoPaymentsRequest { +impl TryFrom<&OpayoRouterData<&types::PaymentsAuthorizeRouterData>> for OpayoPaymentsRequest { type Error = error_stack::Report; - fn try_from(item: &types::PaymentsAuthorizeRouterData) -> Result { + fn try_from( + item_data: &OpayoRouterData<&types::PaymentsAuthorizeRouterData>, + ) -> Result { + let item = item_data.router_data.clone(); match item.request.payment_method_data.clone() { domain::PaymentMethodData::Card(req_card) => { let card = OpayoCard { @@ -39,7 +57,7 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for OpayoPaymentsRequest { complete: item.request.is_auto_capture()?, }; Ok(Self { - amount: item.request.amount, + amount: item_data.amount, card, }) } @@ -143,14 +161,14 @@ impl // Type definition for RefundRequest #[derive(Default, Debug, Serialize)] pub struct OpayoRefundRequest { - pub amount: i64, + pub amount: MinorUnit, } -impl TryFrom<&types::RefundsRouterData> for OpayoRefundRequest { +impl TryFrom<&OpayoRouterData<&types::RefundsRouterData>> for OpayoRefundRequest { type Error = error_stack::Report; - fn try_from(item: &types::RefundsRouterData) -> Result { + fn try_from(item: &OpayoRouterData<&types::RefundsRouterData>) -> Result { Ok(Self { - amount: item.request.refund_amount, + amount: item.amount, }) } } diff --git a/crates/router/tests/connectors/opayo.rs b/crates/router/tests/connectors/opayo.rs index 6bca86fa81..585a6f4486 100644 --- a/crates/router/tests/connectors/opayo.rs +++ b/crates/router/tests/connectors/opayo.rs @@ -15,7 +15,7 @@ impl utils::Connector for OpayoTest { fn get_data(&self) -> types::api::ConnectorData { use router::connector::Opayo; utils::construct_connector_data_old( - Box::new(&Opayo), + Box::new(Opayo::new()), // Remove `dummy_connector` feature gate from module in `main.rs` when updating this to use actual connector variant types::Connector::DummyConnector1, types::api::GetToken::Connector,