From e377279d9cc872238fcfd8de324b44b0249b95c2 Mon Sep 17 00:00:00 2001 From: Adarsh Jha <132337675+adarsh-jha-dev@users.noreply.github.com> Date: Tue, 31 Oct 2023 19:28:58 +0530 Subject: [PATCH] feat(connector): [BitPay] Currency Unit Conversion (#2736) --- crates/router/src/connector/bitpay.rs | 12 +++- .../src/connector/bitpay/transformers.rs | 57 +++++++++++++++---- 2 files changed, 57 insertions(+), 12 deletions(-) diff --git a/crates/router/src/connector/bitpay.rs b/crates/router/src/connector/bitpay.rs index 2dc634426f..e8826e9339 100644 --- a/crates/router/src/connector/bitpay.rs +++ b/crates/router/src/connector/bitpay.rs @@ -82,6 +82,10 @@ impl ConnectorCommon for Bitpay { "bitpay" } + fn get_currency_unit(&self) -> api::CurrencyUnit { + api::CurrencyUnit::Minor + } + fn common_get_content_type(&self) -> &'static str { "application/json" } @@ -169,7 +173,13 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { - let req_obj = bitpay::BitpayPaymentsRequest::try_from(req)?; + let connector_router_data = bitpay::BitpayRouterData::try_from(( + &self.get_currency_unit(), + req.request.currency, + req.request.amount, + req, + ))?; + let req_obj = bitpay::BitpayPaymentsRequest::try_from(&connector_router_data)?; let bitpay_req = types::RequestBody::log_and_get_request_body( &req_obj, diff --git a/crates/router/src/connector/bitpay/transformers.rs b/crates/router/src/connector/bitpay/transformers.rs index f99729da16..c5c20608a7 100644 --- a/crates/router/src/connector/bitpay/transformers.rs +++ b/crates/router/src/connector/bitpay/transformers.rs @@ -9,6 +9,37 @@ use crate::{ types::{self, api, storage::enums, ConnectorAuthType}, }; +#[derive(Debug, Serialize)] +pub struct BitpayRouterData { + pub amount: i64, + pub router_data: T, +} + +impl + TryFrom<( + &types::api::CurrencyUnit, + types::storage::enums::Currency, + i64, + T, + )> for BitpayRouterData +{ + type Error = error_stack::Report; + + fn try_from( + (_currency_unit, _currency, amount, router_data): ( + &types::api::CurrencyUnit, + types::storage::enums::Currency, + i64, + T, + ), + ) -> Result { + Ok(Self { + amount, + router_data, + }) + } +} + #[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "lowercase")] pub enum TransactionSpeed { @@ -31,9 +62,11 @@ pub struct BitpayPaymentsRequest { token: Secret, } -impl TryFrom<&types::PaymentsAuthorizeRouterData> for BitpayPaymentsRequest { +impl TryFrom<&BitpayRouterData<&types::PaymentsAuthorizeRouterData>> for BitpayPaymentsRequest { type Error = error_stack::Report; - fn try_from(item: &types::PaymentsAuthorizeRouterData) -> Result { + fn try_from( + item: &BitpayRouterData<&types::PaymentsAuthorizeRouterData>, + ) -> Result { get_crypto_specific_payment_data(item) } } @@ -152,11 +185,13 @@ pub struct BitpayRefundRequest { pub amount: i64, } -impl TryFrom<&types::RefundsRouterData> for BitpayRefundRequest { +impl TryFrom<&BitpayRouterData<&types::RefundsRouterData>> for BitpayRefundRequest { type Error = error_stack::Report; - fn try_from(item: &types::RefundsRouterData) -> Result { + fn try_from( + item: &BitpayRouterData<&types::RefundsRouterData>, + ) -> Result { Ok(Self { - amount: item.request.refund_amount, + amount: item.router_data.request.refund_amount, }) } } @@ -232,14 +267,14 @@ pub struct BitpayErrorResponse { } fn get_crypto_specific_payment_data( - item: &types::PaymentsAuthorizeRouterData, + item: &BitpayRouterData<&types::PaymentsAuthorizeRouterData>, ) -> Result> { - let price = item.request.amount; - let currency = item.request.currency.to_string(); - let redirect_url = item.request.get_return_url()?; - let notification_url = item.request.get_webhook_url()?; + let price = item.amount; + let currency = item.router_data.request.currency.to_string(); + let redirect_url = item.router_data.request.get_return_url()?; + let notification_url = item.router_data.request.get_webhook_url()?; let transaction_speed = TransactionSpeed::Medium; - let auth_type = item.connector_auth_type.clone(); + let auth_type = item.router_data.connector_auth_type.clone(); let token = match auth_type { ConnectorAuthType::HeaderKey { api_key } => api_key, _ => String::default().into(),