From 556dd103dbdf46bb84b247547dd7cca3d2eec91c Mon Sep 17 00:00:00 2001 From: Kiran Kumar <60121719+KiranKBR@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:56:48 +0530 Subject: [PATCH] refactor(connector): added amount conversion framework for multisafepay (#4982) Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com> --- crates/router/src/connector/multisafepay.rs | 45 ++++++++++++------- .../connector/multisafepay/transformers.rs | 27 ++++++----- crates/router/src/types/api.rs | 2 +- .../router/tests/connectors/multisafepay.rs | 2 +- 4 files changed, 44 insertions(+), 32 deletions(-) diff --git a/crates/router/src/connector/multisafepay.rs b/crates/router/src/connector/multisafepay.rs index fd3edd7c0d..6f35587f72 100644 --- a/crates/router/src/connector/multisafepay.rs +++ b/crates/router/src/connector/multisafepay.rs @@ -1,13 +1,15 @@ pub mod transformers; -use std::fmt::Debug; - use common_enums::AttemptStatus; -use common_utils::request::RequestContent; +use common_utils::{ + request::RequestContent, + types::{AmountConvertor, MinorUnit, MinorUnitForConnector}, +}; use error_stack::{report, ResultExt}; use masking::ExposeInterface; use transformers as multisafepay; +use super::utils::{self as connector_utils}; use crate::{ configs::settings, connector::utils::{is_mandate_supported, PaymentMethodDataType}, @@ -29,8 +31,18 @@ use crate::{ utils::BytesExt, }; -#[derive(Debug, Clone)] -pub struct Multisafepay; +#[derive(Clone)] +pub struct Multisafepay { + amount_converter: &'static (dyn AmountConvertor + Sync), +} + +impl Multisafepay { + pub fn new() -> &'static Self { + &Self { + amount_converter: &MinorUnitForConnector, + } + } +} impl ConnectorCommonExt for Multisafepay where @@ -308,12 +320,12 @@ impl ConnectorIntegration CustomResult { - let connector_router_data = multisafepay::MultisafepayRouterData::try_from(( - &self.get_currency_unit(), + let amount = connector_utils::convert_amount( + self.amount_converter, + req.request.minor_amount, req.request.currency, - req.request.amount, - req, - ))?; + )?; + let connector_router_data = multisafepay::MultisafepayRouterData::from((amount, req)); let connector_req = multisafepay::MultisafepayPaymentsRequest::try_from(&connector_router_data)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -412,13 +424,14 @@ impl ConnectorIntegration, _connectors: &settings::Connectors, ) -> CustomResult { - let connector_req = multisafepay::MultisafepayRouterData::try_from(( - &self.get_currency_unit(), + let amount = connector_utils::convert_amount( + self.amount_converter, + req.request.minor_refund_amount, req.request.currency, - req.request.refund_amount, - req, - ))?; - let connector_req = multisafepay::MultisafepayRefundRequest::try_from(&connector_req)?; + )?; + let connector_router_data = multisafepay::MultisafepayRouterData::from((amount, req)); + let connector_req = + multisafepay::MultisafepayRefundRequest::try_from(&connector_router_data)?; Ok(RequestContent::Json(Box::new(connector_req))) } diff --git a/crates/router/src/connector/multisafepay/transformers.rs b/crates/router/src/connector/multisafepay/transformers.rs index 0fd483a421..5466d56c64 100644 --- a/crates/router/src/connector/multisafepay/transformers.rs +++ b/crates/router/src/connector/multisafepay/transformers.rs @@ -1,6 +1,9 @@ use api_models::enums::BankNames; use common_enums::AttemptStatus; -use common_utils::pii::{Email, IpAddress}; +use common_utils::{ + pii::{Email, IpAddress}, + types::{FloatMajorUnit, MinorUnit}, +}; use masking::ExposeInterface; use serde::{Deserialize, Serialize}; use url::Url; @@ -17,20 +20,16 @@ use crate::{ #[derive(Debug, Serialize)] pub struct MultisafepayRouterData { - amount: i64, + amount: MinorUnit, router_data: T, } -impl TryFrom<(&api::CurrencyUnit, enums::Currency, i64, T)> for MultisafepayRouterData { - type Error = error_stack::Report; - - fn try_from( - (_currency_unit, _currency, amount, item): (&api::CurrencyUnit, enums::Currency, i64, T), - ) -> Result { - Ok(Self { +impl From<(MinorUnit, T)> for MultisafepayRouterData { + fn from((amount, item): (MinorUnit, T)) -> Self { + Self { amount, router_data: item, - }) + } } } @@ -408,7 +407,7 @@ pub struct CheckoutOptions { #[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] pub struct Item { pub name: String, - pub unit_price: f64, + pub unit_price: FloatMajorUnit, pub description: Option, pub quantity: i64, } @@ -426,7 +425,7 @@ pub struct MultisafepayPaymentsRequest { pub gateway: Option, pub order_id: String, pub currency: String, - pub amount: i64, + pub amount: MinorUnit, pub description: String, pub payment_options: Option, pub customer: Option, @@ -890,7 +889,7 @@ pub struct Data { pub payment_type: Option, pub order_id: String, pub currency: Option, - pub amount: Option, + pub amount: Option, pub description: Option, pub capture: Option, pub payment_url: Option, @@ -1018,7 +1017,7 @@ impl #[derive(Debug, Serialize)] pub struct MultisafepayRefundRequest { pub currency: diesel_models::enums::Currency, - pub amount: i64, + pub amount: MinorUnit, pub description: Option, pub refund_order_id: Option, pub checkout_data: Option, diff --git a/crates/router/src/types/api.rs b/crates/router/src/types/api.rs index 56e4392677..4ce33087ba 100644 --- a/crates/router/src/types/api.rs +++ b/crates/router/src/types/api.rs @@ -458,7 +458,7 @@ impl ConnectorData { Ok(ConnectorEnum::Old(Box::new(connector::Mifinity::new()))) } enums::Connector::Multisafepay => { - Ok(ConnectorEnum::Old(Box::new(&connector::Multisafepay))) + Ok(ConnectorEnum::Old(Box::new(connector::Multisafepay::new()))) } enums::Connector::Netcetera => { Ok(ConnectorEnum::Old(Box::new(&connector::Netcetera))) diff --git a/crates/router/tests/connectors/multisafepay.rs b/crates/router/tests/connectors/multisafepay.rs index 390af0b5d8..0d5af818c3 100644 --- a/crates/router/tests/connectors/multisafepay.rs +++ b/crates/router/tests/connectors/multisafepay.rs @@ -14,7 +14,7 @@ impl utils::Connector for MultisafepayTest { fn get_data(&self) -> types::api::ConnectorData { use router::connector::Multisafepay; utils::construct_connector_data_old( - Box::new(&Multisafepay), + Box::new(Multisafepay::new()), types::Connector::Multisafepay, types::api::GetToken::Connector, None,