refactor(connector): Added amount conversion framework to Wise. (#6469)

This commit is contained in:
Maneesh Shukla
2024-11-07 12:14:29 +05:30
committed by GitHub
parent 90d9ffc1d2
commit 1ba3d84df1
4 changed files with 58 additions and 14 deletions

View File

@ -1,8 +1,8 @@
pub mod transformers; pub mod transformers;
use std::fmt::Debug;
#[cfg(feature = "payouts")] #[cfg(feature = "payouts")]
use common_utils::request::RequestContent; use common_utils::request::RequestContent;
use common_utils::types::{AmountConvertor, MinorUnit, MinorUnitForConnector};
use error_stack::{report, ResultExt}; use error_stack::{report, ResultExt};
#[cfg(feature = "payouts")] #[cfg(feature = "payouts")]
use masking::PeekInterface; use masking::PeekInterface;
@ -10,6 +10,7 @@ use masking::PeekInterface;
use router_env::{instrument, tracing}; use router_env::{instrument, tracing};
use self::transformers as wise; use self::transformers as wise;
use super::utils::convert_amount;
use crate::{ use crate::{
configs::settings, configs::settings,
core::errors::{self, CustomResult}, core::errors::{self, CustomResult},
@ -27,8 +28,18 @@ use crate::{
utils::BytesExt, utils::BytesExt,
}; };
#[derive(Debug, Clone)] #[derive(Clone)]
pub struct Wise; pub struct Wise {
amount_converter: &'static (dyn AmountConvertor<Output = MinorUnit> + Sync),
}
impl Wise {
pub fn new() -> &'static Self {
&Self {
amount_converter: &MinorUnitForConnector,
}
}
}
impl<Flow, Request, Response> ConnectorCommonExt<Flow, Request, Response> for Wise impl<Flow, Request, Response> ConnectorCommonExt<Flow, Request, Response> for Wise
where where
@ -362,7 +373,13 @@ impl services::ConnectorIntegration<api::PoQuote, types::PayoutsData, types::Pay
req: &types::PayoutsRouterData<api::PoQuote>, req: &types::PayoutsRouterData<api::PoQuote>,
_connectors: &settings::Connectors, _connectors: &settings::Connectors,
) -> CustomResult<RequestContent, errors::ConnectorError> { ) -> CustomResult<RequestContent, errors::ConnectorError> {
let connector_req = wise::WisePayoutQuoteRequest::try_from(req)?; let amount = convert_amount(
self.amount_converter,
req.request.minor_amount,
req.request.source_currency,
)?;
let connector_router_data = wise::WiseRouterData::from((amount, req));
let connector_req = wise::WisePayoutQuoteRequest::try_from(&connector_router_data)?;
Ok(RequestContent::Json(Box::new(connector_req))) Ok(RequestContent::Json(Box::new(connector_req)))
} }
@ -441,7 +458,13 @@ impl
req: &types::PayoutsRouterData<api::PoRecipient>, req: &types::PayoutsRouterData<api::PoRecipient>,
_connectors: &settings::Connectors, _connectors: &settings::Connectors,
) -> CustomResult<RequestContent, errors::ConnectorError> { ) -> CustomResult<RequestContent, errors::ConnectorError> {
let connector_req = wise::WiseRecipientCreateRequest::try_from(req)?; let amount = convert_amount(
self.amount_converter,
req.request.minor_amount,
req.request.source_currency,
)?;
let connector_router_data = wise::WiseRouterData::from((amount, req));
let connector_req = wise::WiseRecipientCreateRequest::try_from(&connector_router_data)?;
Ok(RequestContent::Json(Box::new(connector_req))) Ok(RequestContent::Json(Box::new(connector_req)))
} }

View File

@ -2,6 +2,7 @@
use api_models::payouts::PayoutMethodData; use api_models::payouts::PayoutMethodData;
#[cfg(feature = "payouts")] #[cfg(feature = "payouts")]
use common_utils::pii::Email; use common_utils::pii::Email;
use common_utils::types::MinorUnit;
use masking::Secret; use masking::Secret;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -16,6 +17,20 @@ use crate::{
}, },
}; };
use crate::{core::errors, types}; use crate::{core::errors, types};
#[derive(Debug, Serialize)]
pub struct WiseRouterData<T> {
pub amount: MinorUnit,
pub router_data: T,
}
impl<T> From<(MinorUnit, T)> for WiseRouterData<T> {
fn from((amount, router_data): (MinorUnit, T)) -> Self {
Self {
amount,
router_data,
}
}
}
pub struct WiseAuthType { pub struct WiseAuthType {
pub(super) api_key: Secret<String>, pub(super) api_key: Secret<String>,
@ -156,8 +171,8 @@ pub struct WiseRecipientCreateResponse {
pub struct WisePayoutQuoteRequest { pub struct WisePayoutQuoteRequest {
source_currency: String, source_currency: String,
target_currency: String, target_currency: String,
source_amount: Option<i64>, source_amount: Option<MinorUnit>,
target_amount: Option<i64>, target_amount: Option<MinorUnit>,
pay_out: WisePayOutOption, pay_out: WisePayOutOption,
} }
@ -348,9 +363,12 @@ fn get_payout_bank_details(
// Payouts recipient create request transform // Payouts recipient create request transform
#[cfg(feature = "payouts")] #[cfg(feature = "payouts")]
impl<F> TryFrom<&types::PayoutsRouterData<F>> for WiseRecipientCreateRequest { impl<F> TryFrom<&WiseRouterData<&types::PayoutsRouterData<F>>> for WiseRecipientCreateRequest {
type Error = Error; type Error = Error;
fn try_from(item: &types::PayoutsRouterData<F>) -> Result<Self, Self::Error> { fn try_from(
item_data: &WiseRouterData<&types::PayoutsRouterData<F>>,
) -> Result<Self, Self::Error> {
let item = item_data.router_data;
let request = item.request.to_owned(); let request = item.request.to_owned();
let customer_details = request.customer_details.to_owned(); let customer_details = request.customer_details.to_owned();
let payout_method_data = item.get_payout_method_data()?; let payout_method_data = item.get_payout_method_data()?;
@ -420,14 +438,17 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, WiseRecipientCreateResponse>
// Payouts quote request transform // Payouts quote request transform
#[cfg(feature = "payouts")] #[cfg(feature = "payouts")]
impl<F> TryFrom<&types::PayoutsRouterData<F>> for WisePayoutQuoteRequest { impl<F> TryFrom<&WiseRouterData<&types::PayoutsRouterData<F>>> for WisePayoutQuoteRequest {
type Error = Error; type Error = Error;
fn try_from(item: &types::PayoutsRouterData<F>) -> Result<Self, Self::Error> { fn try_from(
item_data: &WiseRouterData<&types::PayoutsRouterData<F>>,
) -> Result<Self, Self::Error> {
let item = item_data.router_data;
let request = item.request.to_owned(); let request = item.request.to_owned();
let payout_type = request.get_payout_type()?; let payout_type = request.get_payout_type()?;
match payout_type { match payout_type {
storage_enums::PayoutType::Bank => Ok(Self { storage_enums::PayoutType::Bank => Ok(Self {
source_amount: Some(request.amount), source_amount: Some(item_data.amount),
source_currency: request.source_currency.to_string(), source_currency: request.source_currency.to_string(),
target_amount: None, target_amount: None,
target_currency: request.destination_currency.to_string(), target_currency: request.destination_currency.to_string(),

View File

@ -484,7 +484,7 @@ impl ConnectorData {
enums::Connector::Stripe => { enums::Connector::Stripe => {
Ok(ConnectorEnum::Old(Box::new(connector::Stripe::new()))) Ok(ConnectorEnum::Old(Box::new(connector::Stripe::new())))
} }
enums::Connector::Wise => Ok(ConnectorEnum::Old(Box::new(&connector::Wise))), enums::Connector::Wise => Ok(ConnectorEnum::Old(Box::new(connector::Wise::new()))),
enums::Connector::Worldline => { enums::Connector::Worldline => {
Ok(ConnectorEnum::Old(Box::new(&connector::Worldline))) Ok(ConnectorEnum::Old(Box::new(&connector::Worldline)))
} }

View File

@ -28,7 +28,7 @@ impl utils::Connector for WiseTest {
fn get_payout_data(&self) -> Option<api::ConnectorData> { fn get_payout_data(&self) -> Option<api::ConnectorData> {
use router::connector::Wise; use router::connector::Wise;
Some(utils::construct_connector_data_old( Some(utils::construct_connector_data_old(
Box::new(&Wise), Box::new(Wise::new()),
types::Connector::Wise, types::Connector::Wise,
api::GetToken::Connector, api::GetToken::Connector,
None, None,