refactor(connector): added amount conversion framework for multisafepay (#4982)

Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
Kiran Kumar
2024-08-14 14:56:48 +05:30
committed by GitHub
parent 17703fe2cb
commit 556dd103db
4 changed files with 44 additions and 32 deletions

View File

@ -1,13 +1,15 @@
pub mod transformers; pub mod transformers;
use std::fmt::Debug;
use common_enums::AttemptStatus; use common_enums::AttemptStatus;
use common_utils::request::RequestContent; use common_utils::{
request::RequestContent,
types::{AmountConvertor, MinorUnit, MinorUnitForConnector},
};
use error_stack::{report, ResultExt}; use error_stack::{report, ResultExt};
use masking::ExposeInterface; use masking::ExposeInterface;
use transformers as multisafepay; use transformers as multisafepay;
use super::utils::{self as connector_utils};
use crate::{ use crate::{
configs::settings, configs::settings,
connector::utils::{is_mandate_supported, PaymentMethodDataType}, connector::utils::{is_mandate_supported, PaymentMethodDataType},
@ -29,8 +31,18 @@ use crate::{
utils::BytesExt, utils::BytesExt,
}; };
#[derive(Debug, Clone)] #[derive(Clone)]
pub struct Multisafepay; pub struct Multisafepay {
amount_converter: &'static (dyn AmountConvertor<Output = MinorUnit> + Sync),
}
impl Multisafepay {
pub fn new() -> &'static Self {
&Self {
amount_converter: &MinorUnitForConnector,
}
}
}
impl<Flow, Request, Response> ConnectorCommonExt<Flow, Request, Response> for Multisafepay impl<Flow, Request, Response> ConnectorCommonExt<Flow, Request, Response> for Multisafepay
where where
@ -308,12 +320,12 @@ impl ConnectorIntegration<api::Authorize, types::PaymentsAuthorizeData, types::P
req: &types::PaymentsAuthorizeRouterData, req: &types::PaymentsAuthorizeRouterData,
_connectors: &settings::Connectors, _connectors: &settings::Connectors,
) -> CustomResult<RequestContent, errors::ConnectorError> { ) -> CustomResult<RequestContent, errors::ConnectorError> {
let connector_router_data = multisafepay::MultisafepayRouterData::try_from(( let amount = connector_utils::convert_amount(
&self.get_currency_unit(), self.amount_converter,
req.request.minor_amount,
req.request.currency, req.request.currency,
req.request.amount, )?;
req, let connector_router_data = multisafepay::MultisafepayRouterData::from((amount, req));
))?;
let connector_req = let connector_req =
multisafepay::MultisafepayPaymentsRequest::try_from(&connector_router_data)?; multisafepay::MultisafepayPaymentsRequest::try_from(&connector_router_data)?;
Ok(RequestContent::Json(Box::new(connector_req))) Ok(RequestContent::Json(Box::new(connector_req)))
@ -412,13 +424,14 @@ impl ConnectorIntegration<api::Execute, types::RefundsData, types::RefundsRespon
req: &types::RefundsRouterData<api::Execute>, req: &types::RefundsRouterData<api::Execute>,
_connectors: &settings::Connectors, _connectors: &settings::Connectors,
) -> CustomResult<RequestContent, errors::ConnectorError> { ) -> CustomResult<RequestContent, errors::ConnectorError> {
let connector_req = multisafepay::MultisafepayRouterData::try_from(( let amount = connector_utils::convert_amount(
&self.get_currency_unit(), self.amount_converter,
req.request.minor_refund_amount,
req.request.currency, req.request.currency,
req.request.refund_amount, )?;
req, let connector_router_data = multisafepay::MultisafepayRouterData::from((amount, req));
))?; let connector_req =
let connector_req = multisafepay::MultisafepayRefundRequest::try_from(&connector_req)?; multisafepay::MultisafepayRefundRequest::try_from(&connector_router_data)?;
Ok(RequestContent::Json(Box::new(connector_req))) Ok(RequestContent::Json(Box::new(connector_req)))
} }

View File

@ -1,6 +1,9 @@
use api_models::enums::BankNames; use api_models::enums::BankNames;
use common_enums::AttemptStatus; use common_enums::AttemptStatus;
use common_utils::pii::{Email, IpAddress}; use common_utils::{
pii::{Email, IpAddress},
types::{FloatMajorUnit, MinorUnit},
};
use masking::ExposeInterface; use masking::ExposeInterface;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use url::Url; use url::Url;
@ -17,20 +20,16 @@ use crate::{
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
pub struct MultisafepayRouterData<T> { pub struct MultisafepayRouterData<T> {
amount: i64, amount: MinorUnit,
router_data: T, router_data: T,
} }
impl<T> TryFrom<(&api::CurrencyUnit, enums::Currency, i64, T)> for MultisafepayRouterData<T> { impl<T> From<(MinorUnit, T)> for MultisafepayRouterData<T> {
type Error = error_stack::Report<errors::ConnectorError>; fn from((amount, item): (MinorUnit, T)) -> Self {
Self {
fn try_from(
(_currency_unit, _currency, amount, item): (&api::CurrencyUnit, enums::Currency, i64, T),
) -> Result<Self, Self::Error> {
Ok(Self {
amount, amount,
router_data: item, router_data: item,
}) }
} }
} }
@ -408,7 +407,7 @@ pub struct CheckoutOptions {
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] #[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct Item { pub struct Item {
pub name: String, pub name: String,
pub unit_price: f64, pub unit_price: FloatMajorUnit,
pub description: Option<String>, pub description: Option<String>,
pub quantity: i64, pub quantity: i64,
} }
@ -426,7 +425,7 @@ pub struct MultisafepayPaymentsRequest {
pub gateway: Option<Gateway>, pub gateway: Option<Gateway>,
pub order_id: String, pub order_id: String,
pub currency: String, pub currency: String,
pub amount: i64, pub amount: MinorUnit,
pub description: String, pub description: String,
pub payment_options: Option<PaymentOptions>, pub payment_options: Option<PaymentOptions>,
pub customer: Option<Customer>, pub customer: Option<Customer>,
@ -890,7 +889,7 @@ pub struct Data {
pub payment_type: Option<String>, pub payment_type: Option<String>,
pub order_id: String, pub order_id: String,
pub currency: Option<String>, pub currency: Option<String>,
pub amount: Option<i64>, pub amount: Option<MinorUnit>,
pub description: Option<String>, pub description: Option<String>,
pub capture: Option<String>, pub capture: Option<String>,
pub payment_url: Option<Url>, pub payment_url: Option<Url>,
@ -1018,7 +1017,7 @@ impl<F, T>
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
pub struct MultisafepayRefundRequest { pub struct MultisafepayRefundRequest {
pub currency: diesel_models::enums::Currency, pub currency: diesel_models::enums::Currency,
pub amount: i64, pub amount: MinorUnit,
pub description: Option<String>, pub description: Option<String>,
pub refund_order_id: Option<String>, pub refund_order_id: Option<String>,
pub checkout_data: Option<ShoppingCart>, pub checkout_data: Option<ShoppingCart>,

View File

@ -458,7 +458,7 @@ impl ConnectorData {
Ok(ConnectorEnum::Old(Box::new(connector::Mifinity::new()))) Ok(ConnectorEnum::Old(Box::new(connector::Mifinity::new())))
} }
enums::Connector::Multisafepay => { enums::Connector::Multisafepay => {
Ok(ConnectorEnum::Old(Box::new(&connector::Multisafepay))) Ok(ConnectorEnum::Old(Box::new(connector::Multisafepay::new())))
} }
enums::Connector::Netcetera => { enums::Connector::Netcetera => {
Ok(ConnectorEnum::Old(Box::new(&connector::Netcetera))) Ok(ConnectorEnum::Old(Box::new(&connector::Netcetera)))

View File

@ -14,7 +14,7 @@ impl utils::Connector for MultisafepayTest {
fn get_data(&self) -> types::api::ConnectorData { fn get_data(&self) -> types::api::ConnectorData {
use router::connector::Multisafepay; use router::connector::Multisafepay;
utils::construct_connector_data_old( utils::construct_connector_data_old(
Box::new(&Multisafepay), Box::new(Multisafepay::new()),
types::Connector::Multisafepay, types::Connector::Multisafepay,
types::api::GetToken::Connector, types::api::GetToken::Connector,
None, None,