Skip to content

Commit 3578db7

Browse files
feat(connector): [Mollie] Currency Unit Conversion (#2671)
Co-authored-by: SamraatBansal <[email protected]>
1 parent 88e1f29 commit 3578db7

File tree

2 files changed

+99
-44
lines changed

2 files changed

+99
-44
lines changed

crates/router/src/connector/mollie.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ impl ConnectorCommon for Mollie {
6262
"mollie"
6363
}
6464

65+
fn get_currency_unit(&self) -> api::CurrencyUnit {
66+
api::CurrencyUnit::Base
67+
}
68+
6569
fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str {
6670
connectors.mollie.base_url.as_ref()
6771
}
@@ -229,7 +233,13 @@ impl ConnectorIntegration<api::Authorize, types::PaymentsAuthorizeData, types::P
229233
&self,
230234
req: &types::PaymentsAuthorizeRouterData,
231235
) -> CustomResult<Option<types::RequestBody>, errors::ConnectorError> {
232-
let req_obj = mollie::MolliePaymentsRequest::try_from(req)?;
236+
let router_obj = mollie::MollieRouterData::try_from((
237+
&self.get_currency_unit(),
238+
req.request.currency,
239+
req.request.amount,
240+
req,
241+
))?;
242+
let req_obj = mollie::MolliePaymentsRequest::try_from(&router_obj)?;
233243
let mollie_req = types::RequestBody::log_and_get_request_body(
234244
&req_obj,
235245
utils::Encode::<mollie::MolliePaymentsRequest>::encode_to_string_of_json,
@@ -417,7 +427,13 @@ impl ConnectorIntegration<api::Execute, types::RefundsData, types::RefundsRespon
417427
&self,
418428
req: &types::RefundsRouterData<api::Execute>,
419429
) -> CustomResult<Option<types::RequestBody>, errors::ConnectorError> {
420-
let req_obj = mollie::MollieRefundRequest::try_from(req)?;
430+
let router_obj = mollie::MollieRouterData::try_from((
431+
&self.get_currency_unit(),
432+
req.request.currency,
433+
req.request.refund_amount,
434+
req,
435+
))?;
436+
let req_obj = mollie::MollieRefundRequest::try_from(&router_obj)?;
421437
let mollie_req = types::RequestBody::log_and_get_request_body(
422438
&req_obj,
423439
utils::Encode::<mollie::MollieRefundRequest>::encode_to_string_of_json,

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

Lines changed: 81 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,38 @@ use crate::{
1919

2020
type Error = error_stack::Report<errors::ConnectorError>;
2121

22+
#[derive(Debug, Serialize)]
23+
pub struct MollieRouterData<T> {
24+
pub amount: String,
25+
pub router_data: T,
26+
}
27+
28+
impl<T>
29+
TryFrom<(
30+
&types::api::CurrencyUnit,
31+
types::storage::enums::Currency,
32+
i64,
33+
T,
34+
)> for MollieRouterData<T>
35+
{
36+
type Error = error_stack::Report<errors::ConnectorError>;
37+
38+
fn try_from(
39+
(currency_unit, currency, amount, router_data): (
40+
&types::api::CurrencyUnit,
41+
types::storage::enums::Currency,
42+
i64,
43+
T,
44+
),
45+
) -> Result<Self, Self::Error> {
46+
let amount = utils::get_amount_as_string(currency_unit, amount, currency)?;
47+
Ok(Self {
48+
amount,
49+
router_data,
50+
})
51+
}
52+
}
53+
2254
#[derive(Debug, Serialize)]
2355
#[serde(rename_all = "camelCase")]
2456
pub struct MolliePaymentsRequest {
@@ -120,50 +152,55 @@ pub struct MollieBrowserInfo {
120152
language: String,
121153
}
122154

123-
impl TryFrom<&types::PaymentsAuthorizeRouterData> for MolliePaymentsRequest {
155+
impl TryFrom<&MollieRouterData<&types::PaymentsAuthorizeRouterData>> for MolliePaymentsRequest {
124156
type Error = Error;
125-
fn try_from(item: &types::PaymentsAuthorizeRouterData) -> Result<Self, Self::Error> {
157+
fn try_from(
158+
item: &MollieRouterData<&types::PaymentsAuthorizeRouterData>,
159+
) -> Result<Self, Self::Error> {
126160
let amount = Amount {
127-
currency: item.request.currency,
128-
value: utils::to_currency_base_unit(item.request.amount, item.request.currency)?,
161+
currency: item.router_data.request.currency,
162+
value: item.amount.clone(),
129163
};
130-
let description = item.get_description()?;
131-
let redirect_url = item.request.get_return_url()?;
132-
let payment_method_data = match item.request.capture_method.unwrap_or_default() {
133-
enums::CaptureMethod::Automatic => match &item.request.payment_method_data {
134-
api_models::payments::PaymentMethodData::Card(_) => {
135-
let pm_token = item.get_payment_method_token()?;
136-
Ok(PaymentMethodData::CreditCard(Box::new(
137-
CreditCardMethodData {
138-
billing_address: get_billing_details(item)?,
139-
shipping_address: get_shipping_details(item)?,
140-
card_token: Some(Secret::new(match pm_token {
141-
types::PaymentMethodToken::Token(token) => token,
142-
types::PaymentMethodToken::ApplePayDecrypt(_) => {
143-
Err(errors::ConnectorError::InvalidWalletToken)?
144-
}
145-
})),
146-
},
147-
)))
148-
}
149-
api_models::payments::PaymentMethodData::BankRedirect(ref redirect_data) => {
150-
PaymentMethodData::try_from(redirect_data)
164+
let description = item.router_data.get_description()?;
165+
let redirect_url = item.router_data.request.get_return_url()?;
166+
let payment_method_data = match item.router_data.request.capture_method.unwrap_or_default()
167+
{
168+
enums::CaptureMethod::Automatic => {
169+
match &item.router_data.request.payment_method_data {
170+
api_models::payments::PaymentMethodData::Card(_) => {
171+
let pm_token = item.router_data.get_payment_method_token()?;
172+
Ok(PaymentMethodData::CreditCard(Box::new(
173+
CreditCardMethodData {
174+
billing_address: get_billing_details(item.router_data)?,
175+
shipping_address: get_shipping_details(item.router_data)?,
176+
card_token: Some(Secret::new(match pm_token {
177+
types::PaymentMethodToken::Token(token) => token,
178+
types::PaymentMethodToken::ApplePayDecrypt(_) => {
179+
Err(errors::ConnectorError::InvalidWalletToken)?
180+
}
181+
})),
182+
},
183+
)))
184+
}
185+
api_models::payments::PaymentMethodData::BankRedirect(ref redirect_data) => {
186+
PaymentMethodData::try_from(redirect_data)
187+
}
188+
api_models::payments::PaymentMethodData::Wallet(ref wallet_data) => {
189+
get_payment_method_for_wallet(item.router_data, wallet_data)
190+
}
191+
api_models::payments::PaymentMethodData::BankDebit(ref directdebit_data) => {
192+
PaymentMethodData::try_from(directdebit_data)
193+
}
194+
_ => Err(errors::ConnectorError::NotImplemented(
195+
"Payment Method".to_string(),
196+
))
197+
.into_report(),
151198
}
152-
api_models::payments::PaymentMethodData::Wallet(ref wallet_data) => {
153-
get_payment_method_for_wallet(item, wallet_data)
154-
}
155-
api_models::payments::PaymentMethodData::BankDebit(ref directdebit_data) => {
156-
PaymentMethodData::try_from(directdebit_data)
157-
}
158-
_ => Err(errors::ConnectorError::NotImplemented(
159-
"Payment Method".to_string(),
160-
))
161-
.into_report(),
162-
},
199+
}
163200
_ => Err(errors::ConnectorError::FlowNotSupported {
164201
flow: format!(
165202
"{} capture",
166-
item.request.capture_method.unwrap_or_default()
203+
item.router_data.request.capture_method.unwrap_or_default()
167204
),
168205
connector: "Mollie".to_string(),
169206
})
@@ -526,16 +563,18 @@ pub struct MollieRefundRequest {
526563
description: Option<String>,
527564
}
528565

529-
impl<F> TryFrom<&types::RefundsRouterData<F>> for MollieRefundRequest {
566+
impl<F> TryFrom<&MollieRouterData<&types::RefundsRouterData<F>>> for MollieRefundRequest {
530567
type Error = Error;
531-
fn try_from(item: &types::RefundsRouterData<F>) -> Result<Self, Self::Error> {
568+
fn try_from(
569+
item: &MollieRouterData<&types::RefundsRouterData<F>>,
570+
) -> Result<Self, Self::Error> {
532571
let amount = Amount {
533-
currency: item.request.currency,
534-
value: utils::to_currency_base_unit(item.request.refund_amount, item.request.currency)?,
572+
currency: item.router_data.request.currency,
573+
value: item.amount.clone(),
535574
};
536575
Ok(Self {
537576
amount,
538-
description: item.request.reason.to_owned(),
577+
description: item.router_data.request.reason.to_owned(),
539578
})
540579
}
541580
}

0 commit comments

Comments
 (0)