Skip to content

Commit 1b45a30

Browse files
feat(connector): [NMI] Currency Unit Conversion (#2707)
1 parent 7141b89 commit 1b45a30

File tree

2 files changed

+79
-28
lines changed

2 files changed

+79
-28
lines changed

crates/router/src/connector/nmi.rs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ impl ConnectorCommon for Nmi {
5858
"nmi"
5959
}
6060

61+
fn get_currency_unit(&self) -> api::CurrencyUnit {
62+
api::CurrencyUnit::Base
63+
}
64+
6165
fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str {
6266
connectors.nmi.base_url.as_ref()
6367
}
@@ -210,7 +214,13 @@ impl ConnectorIntegration<api::Authorize, types::PaymentsAuthorizeData, types::P
210214
&self,
211215
req: &types::PaymentsAuthorizeRouterData,
212216
) -> CustomResult<Option<types::RequestBody>, errors::ConnectorError> {
213-
let connector_req = nmi::NmiPaymentsRequest::try_from(req)?;
217+
let connector_router_data = nmi::NmiRouterData::try_from((
218+
&self.get_currency_unit(),
219+
req.request.currency,
220+
req.request.amount,
221+
req,
222+
))?;
223+
let connector_req = nmi::NmiPaymentsRequest::try_from(&connector_router_data)?;
214224
let nmi_req = types::RequestBody::log_and_get_request_body(
215225
&connector_req,
216226
utils::Encode::<nmi::NmiPaymentsRequest>::url_encode,
@@ -351,7 +361,13 @@ impl ConnectorIntegration<api::Capture, types::PaymentsCaptureData, types::Payme
351361
&self,
352362
req: &types::PaymentsCaptureRouterData,
353363
) -> CustomResult<Option<types::RequestBody>, errors::ConnectorError> {
354-
let connector_req = nmi::NmiCaptureRequest::try_from(req)?;
364+
let connector_router_data = nmi::NmiRouterData::try_from((
365+
&self.get_currency_unit(),
366+
req.request.currency,
367+
req.request.amount_to_capture,
368+
req,
369+
))?;
370+
let connector_req = nmi::NmiCaptureRequest::try_from(&connector_router_data)?;
355371
let nmi_req = types::RequestBody::log_and_get_request_body(
356372
&connector_req,
357373
utils::Encode::<NmiCaptureRequest>::url_encode,
@@ -491,7 +507,13 @@ impl ConnectorIntegration<api::Execute, types::RefundsData, types::RefundsRespon
491507
&self,
492508
req: &types::RefundsRouterData<api::Execute>,
493509
) -> CustomResult<Option<types::RequestBody>, errors::ConnectorError> {
494-
let connector_req = nmi::NmiRefundRequest::try_from(req)?;
510+
let connector_router_data = nmi::NmiRouterData::try_from((
511+
&self.get_currency_unit(),
512+
req.request.currency,
513+
req.request.refund_amount,
514+
req,
515+
))?;
516+
let connector_req = nmi::NmiRefundRequest::try_from(&connector_router_data)?;
495517
let nmi_req = types::RequestBody::log_and_get_request_body(
496518
&connector_req,
497519
utils::Encode::<nmi::NmiRefundRequest>::url_encode,

crates/router/src/connector/nmi/transformers.rs

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,37 @@ impl TryFrom<&ConnectorAuthType> for NmiAuthType {
4040
}
4141
}
4242

43+
#[derive(Debug, Serialize)]
44+
pub struct NmiRouterData<T> {
45+
pub amount: f64,
46+
pub router_data: T,
47+
}
48+
49+
impl<T>
50+
TryFrom<(
51+
&types::api::CurrencyUnit,
52+
types::storage::enums::Currency,
53+
i64,
54+
T,
55+
)> for NmiRouterData<T>
56+
{
57+
type Error = Report<errors::ConnectorError>;
58+
59+
fn try_from(
60+
(_currency_unit, currency, amount, router_data): (
61+
&types::api::CurrencyUnit,
62+
types::storage::enums::Currency,
63+
i64,
64+
T,
65+
),
66+
) -> Result<Self, Self::Error> {
67+
Ok(Self {
68+
amount: utils::to_currency_base_unit_asf64(amount, currency)?,
69+
router_data,
70+
})
71+
}
72+
}
73+
4374
#[derive(Debug, Serialize)]
4475
pub struct NmiPaymentsRequest {
4576
#[serde(rename = "type")]
@@ -77,25 +108,27 @@ pub struct ApplePayData {
77108
applepay_payment_data: Secret<String>,
78109
}
79110

80-
impl TryFrom<&types::PaymentsAuthorizeRouterData> for NmiPaymentsRequest {
111+
impl TryFrom<&NmiRouterData<&types::PaymentsAuthorizeRouterData>> for NmiPaymentsRequest {
81112
type Error = Error;
82-
fn try_from(item: &types::PaymentsAuthorizeRouterData) -> Result<Self, Self::Error> {
83-
let transaction_type = match item.request.is_auto_capture()? {
113+
fn try_from(
114+
item: &NmiRouterData<&types::PaymentsAuthorizeRouterData>,
115+
) -> Result<Self, Self::Error> {
116+
let transaction_type = match item.router_data.request.is_auto_capture()? {
84117
true => TransactionType::Sale,
85118
false => TransactionType::Auth,
86119
};
87-
let auth_type: NmiAuthType = (&item.connector_auth_type).try_into()?;
88-
let amount =
89-
utils::to_currency_base_unit_asf64(item.request.amount, item.request.currency)?;
90-
let payment_method = PaymentMethod::try_from(&item.request.payment_method_data)?;
120+
let auth_type: NmiAuthType = (&item.router_data.connector_auth_type).try_into()?;
121+
let amount = item.amount;
122+
let payment_method =
123+
PaymentMethod::try_from(&item.router_data.request.payment_method_data)?;
91124

92125
Ok(Self {
93126
transaction_type,
94127
security_key: auth_type.api_key,
95128
amount,
96-
currency: item.request.currency,
129+
currency: item.router_data.request.currency,
97130
payment_method,
98-
orderid: item.connector_request_reference_id.clone(),
131+
orderid: item.router_data.connector_request_reference_id.clone(),
99132
})
100133
}
101134
}
@@ -243,18 +276,17 @@ pub struct NmiCaptureRequest {
243276
pub amount: Option<f64>,
244277
}
245278

246-
impl TryFrom<&types::PaymentsCaptureRouterData> for NmiCaptureRequest {
279+
impl TryFrom<&NmiRouterData<&types::PaymentsCaptureRouterData>> for NmiCaptureRequest {
247280
type Error = Error;
248-
fn try_from(item: &types::PaymentsCaptureRouterData) -> Result<Self, Self::Error> {
249-
let auth = NmiAuthType::try_from(&item.connector_auth_type)?;
281+
fn try_from(
282+
item: &NmiRouterData<&types::PaymentsCaptureRouterData>,
283+
) -> Result<Self, Self::Error> {
284+
let auth = NmiAuthType::try_from(&item.router_data.connector_auth_type)?;
250285
Ok(Self {
251286
transaction_type: TransactionType::Capture,
252287
security_key: auth.api_key,
253-
transactionid: item.request.connector_transaction_id.clone(),
254-
amount: Some(utils::to_currency_base_unit_asf64(
255-
item.request.amount_to_capture,
256-
item.request.currency,
257-
)?),
288+
transactionid: item.router_data.request.connector_transaction_id.clone(),
289+
amount: Some(item.amount),
258290
})
259291
}
260292
}
@@ -577,18 +609,15 @@ pub struct NmiRefundRequest {
577609
amount: f64,
578610
}
579611

580-
impl<F> TryFrom<&types::RefundsRouterData<F>> for NmiRefundRequest {
612+
impl<F> TryFrom<&NmiRouterData<&types::RefundsRouterData<F>>> for NmiRefundRequest {
581613
type Error = Error;
582-
fn try_from(item: &types::RefundsRouterData<F>) -> Result<Self, Self::Error> {
583-
let auth_type: NmiAuthType = (&item.connector_auth_type).try_into()?;
614+
fn try_from(item: &NmiRouterData<&types::RefundsRouterData<F>>) -> Result<Self, Self::Error> {
615+
let auth_type: NmiAuthType = (&item.router_data.connector_auth_type).try_into()?;
584616
Ok(Self {
585617
transaction_type: TransactionType::Refund,
586618
security_key: auth_type.api_key,
587-
transactionid: item.request.connector_transaction_id.clone(),
588-
amount: utils::to_currency_base_unit_asf64(
589-
item.request.refund_amount,
590-
item.request.currency,
591-
)?,
619+
transactionid: item.router_data.request.connector_transaction_id.clone(),
620+
amount: item.amount,
592621
})
593622
}
594623
}

0 commit comments

Comments
 (0)