mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-28 20:23:43 +08:00
refactor(connector): Added amount conversion framework to Wise. (#6469)
This commit is contained in:
@ -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)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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(),
|
||||||
|
|||||||
@ -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)))
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user