Skip to content

Commit 751f16e

Browse files
refactor(connector): [noon] update and add recommended fields (#2381)
Co-authored-by: Arjun Karthik <[email protected]>
1 parent 53d7604 commit 751f16e

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

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

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use common_utils::pii;
12
use error_stack::ResultExt;
23
use masking::Secret;
34
use serde::{Deserialize, Serialize};
@@ -36,6 +37,23 @@ pub struct NoonSubscriptionData {
3637
name: String,
3738
}
3839

40+
#[derive(Debug, Serialize)]
41+
#[serde(rename_all = "camelCase")]
42+
pub struct NoonBillingAddress {
43+
street: Option<Secret<String>>,
44+
street2: Option<Secret<String>>,
45+
city: Option<String>,
46+
state_province: Option<Secret<String>>,
47+
country: Option<api_models::enums::CountryAlpha2>,
48+
postal_code: Option<Secret<String>>,
49+
}
50+
51+
#[derive(Debug, Serialize)]
52+
#[serde(rename_all = "camelCase")]
53+
pub struct NoonBilling {
54+
address: NoonBillingAddress,
55+
}
56+
3957
#[derive(Debug, Serialize)]
4058
#[serde(rename_all = "camelCase")]
4159
pub struct NoonOrder {
@@ -46,6 +64,7 @@ pub struct NoonOrder {
4664
reference: String,
4765
//Short description of the order.
4866
name: String,
67+
ip_address: Option<Secret<String, pii::IpAddress>>,
4968
}
5069

5170
#[derive(Debug, Serialize)]
@@ -164,6 +183,7 @@ pub struct NoonPaymentsRequest {
164183
configuration: NoonConfiguration,
165184
payment_data: NoonPaymentData,
166185
subscription: Option<NoonSubscriptionData>,
186+
billing: Option<NoonBilling>,
167187
}
168188

169189
impl TryFrom<&types::PaymentsAuthorizeRouterData> for NoonPaymentsRequest {
@@ -247,6 +267,27 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for NoonPaymentsRequest {
247267
.take(50)
248268
.collect();
249269

270+
let ip_address = item.request.get_ip_address_as_optional();
271+
272+
let channel = NoonChannels::Web;
273+
274+
let billing = item
275+
.address
276+
.billing
277+
.clone()
278+
.and_then(|billing_address| billing_address.address)
279+
.map(|address| NoonBilling {
280+
address: NoonBillingAddress {
281+
street: address.line1,
282+
street2: address.line2,
283+
city: address.city,
284+
// If state is passed in request, country becomes mandatory, keep a check while debugging failed payments
285+
state_province: address.state,
286+
country: address.country,
287+
postal_code: address.zip,
288+
},
289+
});
290+
250291
let (subscription, tokenize_c_c) =
251292
match item.request.setup_future_usage.is_some().then_some((
252293
NoonSubscriptionData {
@@ -261,10 +302,11 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for NoonPaymentsRequest {
261302
let order = NoonOrder {
262303
amount: conn_utils::to_currency_base_unit(item.request.amount, item.request.currency)?,
263304
currency,
264-
channel: NoonChannels::Web,
305+
channel,
265306
category,
266307
reference: item.connector_request_reference_id.clone(),
267308
name,
309+
ip_address,
268310
};
269311
let payment_action = if item.request.is_auto_capture()? {
270312
NoonPaymentActions::Sale
@@ -274,6 +316,7 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for NoonPaymentsRequest {
274316
Ok(Self {
275317
api_operation: NoonApiOperations::Initiate,
276318
order,
319+
billing,
277320
configuration: NoonConfiguration {
278321
payment_action,
279322
return_url: item.request.router_return_url.clone(),
@@ -333,7 +376,8 @@ impl From<NoonPaymentStatus> for enums::AttemptStatus {
333376
fn from(item: NoonPaymentStatus) -> Self {
334377
match item {
335378
NoonPaymentStatus::Authorized => Self::Authorized,
336-
NoonPaymentStatus::Captured | NoonPaymentStatus::PartiallyCaptured => Self::Charged,
379+
NoonPaymentStatus::Captured => Self::Charged,
380+
NoonPaymentStatus::PartiallyCaptured => Self::PartialCharged,
337381
NoonPaymentStatus::Reversed => Self::Voided,
338382
NoonPaymentStatus::Cancelled | NoonPaymentStatus::Expired => Self::AuthenticationFailed,
339383
NoonPaymentStatus::ThreeDsEnrollInitiated | NoonPaymentStatus::ThreeDsEnrollChecked => {
@@ -444,6 +488,7 @@ pub struct NoonActionTransaction {
444488
#[serde(rename_all = "camelCase")]
445489
pub struct NoonActionOrder {
446490
id: String,
491+
cancellation_reason: Option<String>,
447492
}
448493

449494
#[derive(Debug, Serialize)]
@@ -459,6 +504,7 @@ impl TryFrom<&types::PaymentsCaptureRouterData> for NoonPaymentsActionRequest {
459504
fn try_from(item: &types::PaymentsCaptureRouterData) -> Result<Self, Self::Error> {
460505
let order = NoonActionOrder {
461506
id: item.request.connector_transaction_id.clone(),
507+
cancellation_reason: None,
462508
};
463509
let transaction = NoonActionTransaction {
464510
amount: conn_utils::to_currency_base_unit(
@@ -488,6 +534,11 @@ impl TryFrom<&types::PaymentsCancelRouterData> for NoonPaymentsCancelRequest {
488534
fn try_from(item: &types::PaymentsCancelRouterData) -> Result<Self, Self::Error> {
489535
let order = NoonActionOrder {
490536
id: item.request.connector_transaction_id.clone(),
537+
cancellation_reason: item
538+
.request
539+
.cancellation_reason
540+
.clone()
541+
.map(|reason| reason.chars().take(100).collect()), // Max 100 chars
491542
};
492543
Ok(Self {
493544
api_operation: NoonApiOperations::Reverse,
@@ -501,6 +552,7 @@ impl<F> TryFrom<&types::RefundsRouterData<F>> for NoonPaymentsActionRequest {
501552
fn try_from(item: &types::RefundsRouterData<F>) -> Result<Self, Self::Error> {
502553
let order = NoonActionOrder {
503554
id: item.request.connector_transaction_id.clone(),
555+
cancellation_reason: None,
504556
};
505557
let transaction = NoonActionTransaction {
506558
amount: conn_utils::to_currency_base_unit(

crates/router/src/connector/utils.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ pub trait PaymentsAuthorizeRequestData {
283283
fn get_payment_method_type(&self) -> Result<diesel_models::enums::PaymentMethodType, Error>;
284284
fn get_connector_mandate_id(&self) -> Result<String, Error>;
285285
fn get_complete_authorize_url(&self) -> Result<String, Error>;
286+
fn get_ip_address_as_optional(&self) -> Option<Secret<String, IpAddress>>;
286287
}
287288

288289
impl PaymentsAuthorizeRequestData for types::PaymentsAuthorizeData {
@@ -370,6 +371,13 @@ impl PaymentsAuthorizeRequestData for types::PaymentsAuthorizeData {
370371
self.connector_mandate_id()
371372
.ok_or_else(missing_field_err("connector_mandate_id"))
372373
}
374+
fn get_ip_address_as_optional(&self) -> Option<Secret<String, IpAddress>> {
375+
self.browser_info.clone().and_then(|browser_info| {
376+
browser_info
377+
.ip_address
378+
.map(|ip| Secret::new(ip.to_string()))
379+
})
380+
}
373381
}
374382

375383
pub trait ConnectorCustomerData {

0 commit comments

Comments
 (0)