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;
use std::fmt::Debug;
#[cfg(feature = "payouts")]
use common_utils::request::RequestContent;
use common_utils::types::{AmountConvertor, MinorUnit, MinorUnitForConnector};
use error_stack::{report, ResultExt};
#[cfg(feature = "payouts")]
use masking::PeekInterface;
@ -10,6 +10,7 @@ use masking::PeekInterface;
use router_env::{instrument, tracing};
use self::transformers as wise;
use super::utils::convert_amount;
use crate::{
configs::settings,
core::errors::{self, CustomResult},
@ -27,8 +28,18 @@ use crate::{
utils::BytesExt,
};
#[derive(Debug, Clone)]
pub struct Wise;
#[derive(Clone)]
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
where
@ -362,7 +373,13 @@ impl services::ConnectorIntegration<api::PoQuote, types::PayoutsData, types::Pay
req: &types::PayoutsRouterData<api::PoQuote>,
_connectors: &settings::Connectors,
) -> 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)))
}
@ -441,7 +458,13 @@ impl
req: &types::PayoutsRouterData<api::PoRecipient>,
_connectors: &settings::Connectors,
) -> 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)))
}

View File

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

View File

@ -484,7 +484,7 @@ impl ConnectorData {
enums::Connector::Stripe => {
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 => {
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> {
use router::connector::Wise;
Some(utils::construct_connector_data_old(
Box::new(&Wise),
Box::new(Wise::new()),
types::Connector::Wise,
api::GetToken::Connector,
None,