refactor(connector): add amount conversion framework to volt (#4985)

This commit is contained in:
Kiran Kumar
2024-07-23 16:04:24 +05:30
committed by GitHub
parent 876eeea0f4
commit e4b3982c13
4 changed files with 43 additions and 37 deletions

View File

@ -1,14 +1,20 @@
pub mod transformers; pub mod transformers;
use std::fmt::Debug; use common_utils::{
crypto,
use common_utils::{crypto, ext_traits::ByteSliceExt, request::RequestContent}; ext_traits::ByteSliceExt,
request::RequestContent,
types::{AmountConvertor, MinorUnit, MinorUnitForConnector},
};
use error_stack::ResultExt; use error_stack::ResultExt;
use masking::{ExposeInterface, PeekInterface}; use masking::{ExposeInterface, PeekInterface};
use transformers as volt; use transformers as volt;
use self::transformers::webhook_headers; use self::transformers::webhook_headers;
use super::utils; use super::{
utils,
utils::{self as connector_utils},
};
use crate::{ use crate::{
configs::settings, configs::settings,
core::errors::{self, CustomResult}, core::errors::{self, CustomResult},
@ -27,8 +33,18 @@ use crate::{
utils::BytesExt, utils::BytesExt,
}; };
#[derive(Debug, Clone)] #[derive(Clone)]
pub struct Volt; pub struct Volt {
amount_converter: &'static (dyn AmountConvertor<Output = MinorUnit> + Sync),
}
impl Volt {
pub fn new() -> &'static Self {
&Self {
amount_converter: &MinorUnitForConnector,
}
}
}
impl api::Payment for Volt {} impl api::Payment for Volt {}
impl api::PaymentSession for Volt {} impl api::PaymentSession for Volt {}
@ -306,12 +322,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 = volt::VoltRouterData::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 = volt::VoltRouterData::from((amount, req));
))?;
let connector_req = volt::VoltPaymentsRequest::try_from(&connector_router_data)?; let connector_req = volt::VoltPaymentsRequest::try_from(&connector_router_data)?;
Ok(RequestContent::Json(Box::new(connector_req))) Ok(RequestContent::Json(Box::new(connector_req)))
} }
@ -560,12 +576,12 @@ 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_router_data = volt::VoltRouterData::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 = volt::VoltRouterData::from((amount, req));
))?;
let connector_req = volt::VoltRefundRequest::try_from(&connector_router_data)?; let connector_req = volt::VoltRefundRequest::try_from(&connector_router_data)?;
Ok(RequestContent::Json(Box::new(connector_req))) Ok(RequestContent::Json(Box::new(connector_req)))
} }

View File

@ -1,4 +1,4 @@
use common_utils::{id_type, pii::Email}; use common_utils::{id_type, pii::Email, types::MinorUnit};
use diesel_models::enums; use diesel_models::enums;
use masking::Secret; use masking::Secret;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -14,26 +14,16 @@ use crate::{
const PASSWORD: &str = "password"; const PASSWORD: &str = "password";
pub struct VoltRouterData<T> { pub struct VoltRouterData<T> {
pub amount: i64, // The type of amount that a connector accepts, for example, String, i64, f64, etc. pub amount: MinorUnit, // The type of amount that a connector accepts, for example, String, i64, f64, etc.
pub router_data: T, pub router_data: T,
} }
impl<T> TryFrom<(&api::CurrencyUnit, types::storage::enums::Currency, i64, T)> impl<T> From<(MinorUnit, T)> for VoltRouterData<T> {
for VoltRouterData<T> fn from((amount, item): (MinorUnit, T)) -> Self {
{ Self {
type Error = error_stack::Report<errors::ConnectorError>;
fn try_from(
(_currency_unit, _currency, amount, item): (
&api::CurrencyUnit,
types::storage::enums::Currency,
i64,
T,
),
) -> Result<Self, Self::Error> {
Ok(Self {
amount, amount,
router_data: item, router_data: item,
}) }
} }
} }
@ -46,7 +36,7 @@ pub mod webhook_headers {
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct VoltPaymentsRequest { pub struct VoltPaymentsRequest {
amount: i64, amount: MinorUnit,
currency_code: storage_enums::Currency, currency_code: storage_enums::Currency,
#[serde(rename = "type")] #[serde(rename = "type")]
transaction_type: TransactionType, transaction_type: TransactionType,
@ -437,7 +427,7 @@ impl From<VoltWebhookPaymentStatus> for enums::AttemptStatus {
#[derive(Default, Debug, Serialize)] #[derive(Default, Debug, Serialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct VoltRefundRequest { pub struct VoltRefundRequest {
pub amount: i64, pub amount: MinorUnit,
pub external_reference: String, pub external_reference: String,
} }
@ -445,7 +435,7 @@ impl<F> TryFrom<&VoltRouterData<&types::RefundsRouterData<F>>> for VoltRefundReq
type Error = error_stack::Report<errors::ConnectorError>; type Error = error_stack::Report<errors::ConnectorError>;
fn try_from(item: &VoltRouterData<&types::RefundsRouterData<F>>) -> Result<Self, Self::Error> { fn try_from(item: &VoltRouterData<&types::RefundsRouterData<F>>) -> Result<Self, Self::Error> {
Ok(Self { Ok(Self {
amount: item.router_data.request.refund_amount, amount: item.amount,
external_reference: item.router_data.request.refund_id.clone(), external_reference: item.router_data.request.refund_id.clone(),
}) })
} }

View File

@ -500,7 +500,7 @@ impl ConnectorData {
Ok(ConnectorEnum::Old(Box::new(connector::Trustpay::new()))) Ok(ConnectorEnum::Old(Box::new(connector::Trustpay::new())))
} }
enums::Connector::Tsys => Ok(ConnectorEnum::Old(Box::new(&connector::Tsys))), enums::Connector::Tsys => Ok(ConnectorEnum::Old(Box::new(&connector::Tsys))),
enums::Connector::Volt => Ok(ConnectorEnum::Old(Box::new(&connector::Volt))), enums::Connector::Volt => Ok(ConnectorEnum::Old(Box::new(connector::Volt::new()))),
enums::Connector::Zen => Ok(ConnectorEnum::Old(Box::new(&connector::Zen))), enums::Connector::Zen => Ok(ConnectorEnum::Old(Box::new(&connector::Zen))),
enums::Connector::Zsl => Ok(ConnectorEnum::Old(Box::new(&connector::Zsl))), enums::Connector::Zsl => Ok(ConnectorEnum::Old(Box::new(&connector::Zsl))),
enums::Connector::Plaid => { enums::Connector::Plaid => {

View File

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