mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 01:57:45 +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
	 Gaurav Ghodinde
					Gaurav Ghodinde