mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-30 01:27:31 +08:00
refactor(connector): add amount conversion framework to tsys (#6282)
Co-authored-by: DEEPANSHU BANSAL <41580413+deepanshu-iiitu@users.noreply.github.com>
This commit is contained in:
@ -1,12 +1,11 @@
|
|||||||
pub mod transformers;
|
pub mod transformers;
|
||||||
|
|
||||||
use std::fmt::Debug;
|
|
||||||
|
|
||||||
use common_enums::enums;
|
use common_enums::enums;
|
||||||
use common_utils::{
|
use common_utils::{
|
||||||
errors::CustomResult,
|
errors::CustomResult,
|
||||||
ext_traits::BytesExt,
|
ext_traits::BytesExt,
|
||||||
request::{Method, Request, RequestBuilder, RequestContent},
|
request::{Method, Request, RequestBuilder, RequestContent},
|
||||||
|
types::{AmountConvertor, StringMinorUnit, StringMinorUnitForConnector},
|
||||||
};
|
};
|
||||||
use error_stack::{report, ResultExt};
|
use error_stack::{report, ResultExt};
|
||||||
use hyperswitch_domain_models::{
|
use hyperswitch_domain_models::{
|
||||||
@ -41,10 +40,18 @@ use hyperswitch_interfaces::{
|
|||||||
use transformers as tsys;
|
use transformers as tsys;
|
||||||
|
|
||||||
use crate::{constants::headers, types::ResponseRouterData, utils};
|
use crate::{constants::headers, types::ResponseRouterData, utils};
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct Tsys {
|
||||||
|
amount_converter: &'static (dyn AmountConvertor<Output = StringMinorUnit> + Sync),
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
impl Tsys {
|
||||||
pub struct Tsys;
|
pub fn new() -> &'static Self {
|
||||||
|
&Self {
|
||||||
|
amount_converter: &StringMinorUnitForConnector,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
impl api::Payment for Tsys {}
|
impl api::Payment for Tsys {}
|
||||||
impl api::PaymentSession for Tsys {}
|
impl api::PaymentSession for Tsys {}
|
||||||
impl api::ConnectorAccessToken for Tsys {}
|
impl api::ConnectorAccessToken for Tsys {}
|
||||||
@ -156,7 +163,14 @@ impl ConnectorIntegration<Authorize, PaymentsAuthorizeData, PaymentsResponseData
|
|||||||
req: &PaymentsAuthorizeRouterData,
|
req: &PaymentsAuthorizeRouterData,
|
||||||
_connectors: &Connectors,
|
_connectors: &Connectors,
|
||||||
) -> CustomResult<RequestContent, errors::ConnectorError> {
|
) -> CustomResult<RequestContent, errors::ConnectorError> {
|
||||||
let connector_req = tsys::TsysPaymentsRequest::try_from(req)?;
|
let amount = utils::convert_amount(
|
||||||
|
self.amount_converter,
|
||||||
|
req.request.minor_amount,
|
||||||
|
req.request.currency,
|
||||||
|
)?;
|
||||||
|
let connector_router_data = tsys::TsysRouterData::from((amount, req));
|
||||||
|
let connector_req: transformers::TsysPaymentsRequest =
|
||||||
|
tsys::TsysPaymentsRequest::try_from(&connector_router_data)?;
|
||||||
Ok(RequestContent::Json(Box::new(connector_req)))
|
Ok(RequestContent::Json(Box::new(connector_req)))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -316,7 +330,13 @@ impl ConnectorIntegration<Capture, PaymentsCaptureData, PaymentsResponseData> fo
|
|||||||
req: &PaymentsCaptureRouterData,
|
req: &PaymentsCaptureRouterData,
|
||||||
_connectors: &Connectors,
|
_connectors: &Connectors,
|
||||||
) -> CustomResult<RequestContent, errors::ConnectorError> {
|
) -> CustomResult<RequestContent, errors::ConnectorError> {
|
||||||
let connector_req = tsys::TsysPaymentsCaptureRequest::try_from(req)?;
|
let amount = utils::convert_amount(
|
||||||
|
self.amount_converter,
|
||||||
|
req.request.minor_amount_to_capture,
|
||||||
|
req.request.currency,
|
||||||
|
)?;
|
||||||
|
let connector_router_data = tsys::TsysRouterData::from((amount, req));
|
||||||
|
let connector_req = tsys::TsysPaymentsCaptureRequest::try_from(&connector_router_data)?;
|
||||||
Ok(RequestContent::Json(Box::new(connector_req)))
|
Ok(RequestContent::Json(Box::new(connector_req)))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -473,7 +493,14 @@ impl ConnectorIntegration<Execute, RefundsData, RefundsResponseData> for Tsys {
|
|||||||
req: &RefundsRouterData<Execute>,
|
req: &RefundsRouterData<Execute>,
|
||||||
_connectors: &Connectors,
|
_connectors: &Connectors,
|
||||||
) -> CustomResult<RequestContent, errors::ConnectorError> {
|
) -> CustomResult<RequestContent, errors::ConnectorError> {
|
||||||
let connector_req = tsys::TsysRefundRequest::try_from(req)?;
|
let amount = utils::convert_amount(
|
||||||
|
self.amount_converter,
|
||||||
|
req.request.minor_refund_amount,
|
||||||
|
req.request.currency,
|
||||||
|
)?;
|
||||||
|
let connector_router_data = tsys::TsysRouterData::from((amount, req));
|
||||||
|
|
||||||
|
let connector_req = tsys::TsysRefundRequest::try_from(&connector_router_data)?;
|
||||||
Ok(RequestContent::Json(Box::new(connector_req)))
|
Ok(RequestContent::Json(Box::new(connector_req)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
use common_enums::enums;
|
use common_enums::enums;
|
||||||
|
use common_utils::types::StringMinorUnit;
|
||||||
use error_stack::ResultExt;
|
use error_stack::ResultExt;
|
||||||
use hyperswitch_domain_models::{
|
use hyperswitch_domain_models::{
|
||||||
payment_method_data::PaymentMethodData,
|
payment_method_data::PaymentMethodData,
|
||||||
@ -7,13 +8,26 @@ use hyperswitch_domain_models::{
|
|||||||
router_request_types::ResponseId,
|
router_request_types::ResponseId,
|
||||||
router_response_types::{PaymentsResponseData, RefundsResponseData},
|
router_response_types::{PaymentsResponseData, RefundsResponseData},
|
||||||
types::{
|
types::{
|
||||||
self, PaymentsCancelRouterData, PaymentsCaptureRouterData, PaymentsSyncRouterData,
|
self, PaymentsCancelRouterData, PaymentsSyncRouterData, RefundSyncRouterData,
|
||||||
RefundSyncRouterData, RefundsRouterData,
|
RefundsRouterData,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use hyperswitch_interfaces::errors;
|
use hyperswitch_interfaces::errors;
|
||||||
use masking::Secret;
|
use masking::Secret;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
pub struct TsysRouterData<T> {
|
||||||
|
pub amount: StringMinorUnit,
|
||||||
|
pub router_data: T,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> From<(StringMinorUnit, T)> for TsysRouterData<T> {
|
||||||
|
fn from((amount, router_data): (StringMinorUnit, T)) -> Self {
|
||||||
|
Self {
|
||||||
|
amount,
|
||||||
|
router_data,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
types::{RefundsResponseRouterData, ResponseRouterData},
|
types::{RefundsResponseRouterData, ResponseRouterData},
|
||||||
@ -33,7 +47,7 @@ pub struct TsysPaymentAuthSaleRequest {
|
|||||||
device_id: Secret<String>,
|
device_id: Secret<String>,
|
||||||
transaction_key: Secret<String>,
|
transaction_key: Secret<String>,
|
||||||
card_data_source: String,
|
card_data_source: String,
|
||||||
transaction_amount: String,
|
transaction_amount: StringMinorUnit,
|
||||||
currency_code: enums::Currency,
|
currency_code: enums::Currency,
|
||||||
card_number: cards::CardNumber,
|
card_number: cards::CardNumber,
|
||||||
expiration_date: Secret<String>,
|
expiration_date: Secret<String>,
|
||||||
@ -46,9 +60,12 @@ pub struct TsysPaymentAuthSaleRequest {
|
|||||||
order_number: String,
|
order_number: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TryFrom<&types::PaymentsAuthorizeRouterData> for TsysPaymentsRequest {
|
impl TryFrom<&TsysRouterData<&types::PaymentsAuthorizeRouterData>> for TsysPaymentsRequest {
|
||||||
type Error = error_stack::Report<errors::ConnectorError>;
|
type Error = error_stack::Report<errors::ConnectorError>;
|
||||||
fn try_from(item: &types::PaymentsAuthorizeRouterData) -> Result<Self, Self::Error> {
|
fn try_from(
|
||||||
|
item_data: &TsysRouterData<&types::PaymentsAuthorizeRouterData>,
|
||||||
|
) -> Result<Self, Self::Error> {
|
||||||
|
let item = item_data.router_data.clone();
|
||||||
match item.request.payment_method_data.clone() {
|
match item.request.payment_method_data.clone() {
|
||||||
PaymentMethodData::Card(ccard) => {
|
PaymentMethodData::Card(ccard) => {
|
||||||
let connector_auth: TsysAuthType =
|
let connector_auth: TsysAuthType =
|
||||||
@ -57,7 +74,7 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for TsysPaymentsRequest {
|
|||||||
device_id: connector_auth.device_id,
|
device_id: connector_auth.device_id,
|
||||||
transaction_key: connector_auth.transaction_key,
|
transaction_key: connector_auth.transaction_key,
|
||||||
card_data_source: "INTERNET".to_string(),
|
card_data_source: "INTERNET".to_string(),
|
||||||
transaction_amount: item.request.amount.to_string(),
|
transaction_amount: item_data.amount.clone(),
|
||||||
currency_code: item.request.currency,
|
currency_code: item.request.currency,
|
||||||
card_number: ccard.card_number.clone(),
|
card_number: ccard.card_number.clone(),
|
||||||
expiration_date: ccard
|
expiration_date: ccard
|
||||||
@ -430,7 +447,7 @@ pub struct TsysCaptureRequest {
|
|||||||
#[serde(rename = "deviceID")]
|
#[serde(rename = "deviceID")]
|
||||||
device_id: Secret<String>,
|
device_id: Secret<String>,
|
||||||
transaction_key: Secret<String>,
|
transaction_key: Secret<String>,
|
||||||
transaction_amount: String,
|
transaction_amount: StringMinorUnit,
|
||||||
#[serde(rename = "transactionID")]
|
#[serde(rename = "transactionID")]
|
||||||
transaction_id: String,
|
transaction_id: String,
|
||||||
#[serde(rename = "developerID")]
|
#[serde(rename = "developerID")]
|
||||||
@ -444,16 +461,19 @@ pub struct TsysPaymentsCaptureRequest {
|
|||||||
capture: TsysCaptureRequest,
|
capture: TsysCaptureRequest,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TryFrom<&PaymentsCaptureRouterData> for TsysPaymentsCaptureRequest {
|
impl TryFrom<&TsysRouterData<&types::PaymentsCaptureRouterData>> for TsysPaymentsCaptureRequest {
|
||||||
type Error = error_stack::Report<errors::ConnectorError>;
|
type Error = error_stack::Report<errors::ConnectorError>;
|
||||||
fn try_from(item: &PaymentsCaptureRouterData) -> Result<Self, Self::Error> {
|
fn try_from(
|
||||||
|
item_data: &TsysRouterData<&types::PaymentsCaptureRouterData>,
|
||||||
|
) -> Result<Self, Self::Error> {
|
||||||
|
let item = item_data.router_data.clone();
|
||||||
let connector_auth: TsysAuthType = TsysAuthType::try_from(&item.connector_auth_type)?;
|
let connector_auth: TsysAuthType = TsysAuthType::try_from(&item.connector_auth_type)?;
|
||||||
let capture = TsysCaptureRequest {
|
let capture = TsysCaptureRequest {
|
||||||
device_id: connector_auth.device_id,
|
device_id: connector_auth.device_id,
|
||||||
transaction_key: connector_auth.transaction_key,
|
transaction_key: connector_auth.transaction_key,
|
||||||
transaction_id: item.request.connector_transaction_id.clone(),
|
transaction_id: item.request.connector_transaction_id.clone(),
|
||||||
developer_id: connector_auth.developer_id,
|
developer_id: connector_auth.developer_id,
|
||||||
transaction_amount: item.request.amount_to_capture.to_string(),
|
transaction_amount: item_data.amount.clone(),
|
||||||
};
|
};
|
||||||
Ok(Self { capture })
|
Ok(Self { capture })
|
||||||
}
|
}
|
||||||
@ -466,7 +486,7 @@ pub struct TsysReturnRequest {
|
|||||||
#[serde(rename = "deviceID")]
|
#[serde(rename = "deviceID")]
|
||||||
device_id: Secret<String>,
|
device_id: Secret<String>,
|
||||||
transaction_key: Secret<String>,
|
transaction_key: Secret<String>,
|
||||||
transaction_amount: String,
|
transaction_amount: StringMinorUnit,
|
||||||
#[serde(rename = "transactionID")]
|
#[serde(rename = "transactionID")]
|
||||||
transaction_id: String,
|
transaction_id: String,
|
||||||
}
|
}
|
||||||
@ -478,14 +498,15 @@ pub struct TsysRefundRequest {
|
|||||||
return_request: TsysReturnRequest,
|
return_request: TsysReturnRequest,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F> TryFrom<&RefundsRouterData<F>> for TsysRefundRequest {
|
impl<F> TryFrom<&TsysRouterData<&RefundsRouterData<F>>> for TsysRefundRequest {
|
||||||
type Error = error_stack::Report<errors::ConnectorError>;
|
type Error = error_stack::Report<errors::ConnectorError>;
|
||||||
fn try_from(item: &RefundsRouterData<F>) -> Result<Self, Self::Error> {
|
fn try_from(item_data: &TsysRouterData<&RefundsRouterData<F>>) -> Result<Self, Self::Error> {
|
||||||
|
let item = item_data.router_data;
|
||||||
let connector_auth: TsysAuthType = TsysAuthType::try_from(&item.connector_auth_type)?;
|
let connector_auth: TsysAuthType = TsysAuthType::try_from(&item.connector_auth_type)?;
|
||||||
let return_request = TsysReturnRequest {
|
let return_request = TsysReturnRequest {
|
||||||
device_id: connector_auth.device_id,
|
device_id: connector_auth.device_id,
|
||||||
transaction_key: connector_auth.transaction_key,
|
transaction_key: connector_auth.transaction_key,
|
||||||
transaction_amount: item.request.refund_amount.to_string(),
|
transaction_amount: item_data.amount.clone(),
|
||||||
transaction_id: item.request.connector_transaction_id.clone(),
|
transaction_id: item.request.connector_transaction_id.clone(),
|
||||||
};
|
};
|
||||||
Ok(Self { return_request })
|
Ok(Self { return_request })
|
||||||
|
|||||||
@ -507,7 +507,7 @@ impl ConnectorData {
|
|||||||
enums::Connector::Trustpay => {
|
enums::Connector::Trustpay => {
|
||||||
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::new()))),
|
||||||
|
|
||||||
enums::Connector::Volt => Ok(ConnectorEnum::Old(Box::new(connector::Volt::new()))),
|
enums::Connector::Volt => Ok(ConnectorEnum::Old(Box::new(connector::Volt::new()))),
|
||||||
enums::Connector::Wellsfargo => {
|
enums::Connector::Wellsfargo => {
|
||||||
|
|||||||
@ -16,7 +16,7 @@ impl utils::Connector for TsysTest {
|
|||||||
fn get_data(&self) -> types::api::ConnectorData {
|
fn get_data(&self) -> types::api::ConnectorData {
|
||||||
use router::connector::Tsys;
|
use router::connector::Tsys;
|
||||||
utils::construct_connector_data_old(
|
utils::construct_connector_data_old(
|
||||||
Box::new(&Tsys),
|
Box::new(Tsys::new()),
|
||||||
types::Connector::Tsys,
|
types::Connector::Tsys,
|
||||||
types::api::GetToken::Connector,
|
types::api::GetToken::Connector,
|
||||||
None,
|
None,
|
||||||
|
|||||||
Reference in New Issue
Block a user