refactor(connector): add amount conversion framework to rapyd (#6414)

This commit is contained in:
Gaurav Ghodinde
2024-10-30 19:44:44 +05:30
committed by GitHub
parent 62067e406a
commit 33bc83fce4
4 changed files with 42 additions and 33 deletions

View File

@ -1,11 +1,11 @@
pub mod transformers; pub mod transformers;
use std::fmt::Debug;
use base64::Engine; use base64::Engine;
use common_utils::{ use common_utils::{
date_time, date_time,
ext_traits::{Encode, StringExt}, ext_traits::{Encode, StringExt},
request::RequestContent, request::RequestContent,
types::{AmountConvertor, MinorUnit, MinorUnitForConnector},
}; };
use diesel_models::enums; use diesel_models::enums;
use error_stack::{Report, ResultExt}; use error_stack::{Report, ResultExt};
@ -17,6 +17,7 @@ use transformers as rapyd;
use super::utils as connector_utils; use super::utils as connector_utils;
use crate::{ use crate::{
configs::settings, configs::settings,
connector::utils::convert_amount,
consts, consts,
core::errors::{self, CustomResult}, core::errors::{self, CustomResult},
events::connector_api_logs::ConnectorEvent, events::connector_api_logs::ConnectorEvent,
@ -34,9 +35,17 @@ use crate::{
utils::{self, crypto, ByteSliceExt, BytesExt}, utils::{self, crypto, ByteSliceExt, BytesExt},
}; };
#[derive(Debug, Clone)] #[derive(Clone)]
pub struct Rapyd; pub struct Rapyd {
amount_converter: &'static (dyn AmountConvertor<Output = MinorUnit> + Sync),
}
impl Rapyd {
pub fn new() -> &'static Self {
&Self {
amount_converter: &MinorUnitForConnector,
}
}
}
impl Rapyd { impl Rapyd {
pub fn generate_signature( pub fn generate_signature(
&self, &self,
@ -198,12 +207,12 @@ impl
req: &types::PaymentsAuthorizeRouterData, req: &types::PaymentsAuthorizeRouterData,
_connectors: &settings::Connectors, _connectors: &settings::Connectors,
) -> CustomResult<RequestContent, errors::ConnectorError> { ) -> CustomResult<RequestContent, errors::ConnectorError> {
let connector_router_data = rapyd::RapydRouterData::try_from(( let amount = 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 = rapyd::RapydRouterData::from((amount, req));
))?;
let connector_req = rapyd::RapydPaymentsRequest::try_from(&connector_router_data)?; let connector_req = rapyd::RapydPaymentsRequest::try_from(&connector_router_data)?;
Ok(RequestContent::Json(Box::new(connector_req))) Ok(RequestContent::Json(Box::new(connector_req)))
} }
@ -528,12 +537,12 @@ impl
req: &types::PaymentsCaptureRouterData, req: &types::PaymentsCaptureRouterData,
_connectors: &settings::Connectors, _connectors: &settings::Connectors,
) -> CustomResult<RequestContent, errors::ConnectorError> { ) -> CustomResult<RequestContent, errors::ConnectorError> {
let connector_router_data = rapyd::RapydRouterData::try_from(( let amount = convert_amount(
&self.get_currency_unit(), self.amount_converter,
req.request.minor_amount_to_capture,
req.request.currency, req.request.currency,
req.request.amount_to_capture, )?;
req, let connector_router_data = rapyd::RapydRouterData::from((amount, req));
))?;
let connector_req = rapyd::CaptureRequest::try_from(&connector_router_data)?; let connector_req = rapyd::CaptureRequest::try_from(&connector_router_data)?;
Ok(RequestContent::Json(Box::new(connector_req))) Ok(RequestContent::Json(Box::new(connector_req)))
} }
@ -668,12 +677,12 @@ impl services::ConnectorIntegration<api::Execute, types::RefundsData, types::Ref
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 = rapyd::RapydRouterData::try_from(( let amount = 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 = rapyd::RapydRouterData::from((amount, req));
))?;
let connector_req = rapyd::RapydRefundRequest::try_from(&connector_router_data)?; let connector_req = rapyd::RapydRefundRequest::try_from(&connector_router_data)?;
Ok(RequestContent::Json(Box::new(connector_req))) Ok(RequestContent::Json(Box::new(connector_req)))

View File

@ -1,3 +1,4 @@
use common_utils::types::MinorUnit;
use error_stack::ResultExt; use error_stack::ResultExt;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use time::PrimitiveDateTime; use time::PrimitiveDateTime;
@ -15,25 +16,22 @@ use crate::{
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
pub struct RapydRouterData<T> { pub struct RapydRouterData<T> {
pub amount: i64, pub amount: MinorUnit,
pub router_data: T, pub router_data: T,
} }
impl<T> TryFrom<(&api::CurrencyUnit, enums::Currency, i64, T)> for RapydRouterData<T> { impl<T> From<(MinorUnit, T)> for RapydRouterData<T> {
type Error = error_stack::Report<errors::ConnectorError>; fn from((amount, router_data): (MinorUnit, T)) -> Self {
fn try_from( Self {
(_currency_unit, _currency, amount, item): (&api::CurrencyUnit, enums::Currency, i64, T),
) -> Result<Self, Self::Error> {
Ok(Self {
amount, amount,
router_data: item, router_data,
}) }
} }
} }
#[derive(Default, Debug, Serialize)] #[derive(Default, Debug, Serialize)]
pub struct RapydPaymentsRequest { pub struct RapydPaymentsRequest {
pub amount: i64, pub amount: MinorUnit,
pub currency: enums::Currency, pub currency: enums::Currency,
pub payment_method: PaymentMethod, pub payment_method: PaymentMethod,
pub payment_method_options: Option<PaymentMethodOptions>, pub payment_method_options: Option<PaymentMethodOptions>,
@ -302,7 +300,7 @@ pub struct DisputeResponseData {
#[derive(Default, Debug, Serialize)] #[derive(Default, Debug, Serialize)]
pub struct RapydRefundRequest { pub struct RapydRefundRequest {
pub payment: String, pub payment: String,
pub amount: Option<i64>, pub amount: Option<MinorUnit>,
pub currency: Option<enums::Currency>, pub currency: Option<enums::Currency>,
} }
@ -409,7 +407,7 @@ impl TryFrom<types::RefundsResponseRouterData<api::RSync, RefundResponse>>
#[derive(Debug, Serialize, Clone)] #[derive(Debug, Serialize, Clone)]
pub struct CaptureRequest { pub struct CaptureRequest {
amount: Option<i64>, amount: Option<MinorUnit>,
receipt_email: Option<Secret<String>>, receipt_email: Option<Secret<String>>,
statement_descriptor: Option<String>, statement_descriptor: Option<String>,
} }

View File

@ -471,7 +471,9 @@ impl ConnectorData {
enums::Connector::Razorpay => { enums::Connector::Razorpay => {
Ok(ConnectorEnum::Old(Box::new(connector::Razorpay::new()))) Ok(ConnectorEnum::Old(Box::new(connector::Razorpay::new())))
} }
enums::Connector::Rapyd => Ok(ConnectorEnum::Old(Box::new(&connector::Rapyd))), enums::Connector::Rapyd => {
Ok(ConnectorEnum::Old(Box::new(connector::Rapyd::new())))
}
enums::Connector::Shift4 => { enums::Connector::Shift4 => {
Ok(ConnectorEnum::Old(Box::new(connector::Shift4::new()))) Ok(ConnectorEnum::Old(Box::new(connector::Shift4::new())))
} }

View File

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