Skip to content

Commit ea18886

Browse files
Debarshi-GuptaDebarshi Guptahyperswitch-bot[bot]
authored
refactor(connector): [AUTHORIZEDOTNET] Add metadata information to connector request (#7011)
Co-authored-by: Debarshi Gupta <[email protected]> Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
1 parent f71cc96 commit ea18886

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

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

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::collections::BTreeMap;
2+
13
use common_utils::{
24
errors::CustomResult,
35
ext_traits::{Encode, ValueExt},
@@ -6,6 +8,7 @@ use error_stack::ResultExt;
68
use masking::{ExposeInterface, PeekInterface, Secret, StrongSecret};
79
use rand::distributions::{Alphanumeric, DistString};
810
use serde::{Deserialize, Serialize};
11+
use serde_json::Value;
912

1013
use crate::{
1114
connector::utils::{
@@ -143,12 +146,27 @@ struct TransactionRequest {
143146
#[serde(skip_serializing_if = "Option::is_none")]
144147
bill_to: Option<BillTo>,
145148
#[serde(skip_serializing_if = "Option::is_none")]
149+
user_fields: Option<UserFields>,
150+
#[serde(skip_serializing_if = "Option::is_none")]
146151
processing_options: Option<ProcessingOptions>,
147152
#[serde(skip_serializing_if = "Option::is_none")]
148153
subsequent_auth_information: Option<SubsequentAuthInformation>,
149154
authorization_indicator_type: Option<AuthorizationIndicator>,
150155
}
151156

157+
#[derive(Debug, Serialize)]
158+
#[serde(rename_all = "camelCase")]
159+
pub struct UserFields {
160+
user_field: Vec<UserField>,
161+
}
162+
163+
#[derive(Debug, Serialize)]
164+
#[serde(rename_all = "camelCase")]
165+
pub struct UserField {
166+
name: String,
167+
value: String,
168+
}
169+
152170
#[derive(Serialize, Deserialize, Debug)]
153171
#[serde(untagged)]
154172
enum ProfileDetails {
@@ -299,6 +317,25 @@ pub enum ValidationMode {
299317
LiveMode,
300318
}
301319

320+
impl ForeignTryFrom<Value> for Vec<UserField> {
321+
type Error = error_stack::Report<errors::ConnectorError>;
322+
fn foreign_try_from(metadata: Value) -> Result<Self, Self::Error> {
323+
let hashmap: BTreeMap<String, Value> = serde_json::from_str(&metadata.to_string())
324+
.change_context(errors::ConnectorError::RequestEncodingFailedWithReason(
325+
"Failed to serialize request metadata".to_owned(),
326+
))
327+
.attach_printable("")?;
328+
let mut vector: Self = Self::new();
329+
for (key, value) in hashmap {
330+
vector.push(UserField {
331+
name: key,
332+
value: value.to_string(),
333+
});
334+
}
335+
Ok(vector)
336+
}
337+
}
338+
302339
impl TryFrom<&types::SetupMandateRouterData> for CreateCustomerProfileRequest {
303340
type Error = error_stack::Report<errors::ConnectorError>;
304341
fn try_from(item: &types::SetupMandateRouterData) -> Result<Self, Self::Error> {
@@ -622,6 +659,12 @@ impl
622659
zip: address.zip.clone(),
623660
country: address.country,
624661
}),
662+
user_fields: match item.router_data.request.metadata.clone() {
663+
Some(metadata) => Some(UserFields {
664+
user_field: Vec::<UserField>::foreign_try_from(metadata)?,
665+
}),
666+
None => None,
667+
},
625668
processing_options: Some(ProcessingOptions {
626669
is_subsequent_auth: true,
627670
}),
@@ -675,6 +718,12 @@ impl
675718
},
676719
customer: None,
677720
bill_to: None,
721+
user_fields: match item.router_data.request.metadata.clone() {
722+
Some(metadata) => Some(UserFields {
723+
user_field: Vec::<UserField>::foreign_try_from(metadata)?,
724+
}),
725+
None => None,
726+
},
678727
processing_options: Some(ProcessingOptions {
679728
is_subsequent_auth: true,
680729
}),
@@ -764,6 +813,12 @@ impl
764813
zip: address.zip.clone(),
765814
country: address.country,
766815
}),
816+
user_fields: match item.router_data.request.metadata.clone() {
817+
Some(metadata) => Some(UserFields {
818+
user_field: Vec::<UserField>::foreign_try_from(metadata)?,
819+
}),
820+
None => None,
821+
},
767822
processing_options: None,
768823
subsequent_auth_information: None,
769824
authorization_indicator_type: match item.router_data.request.capture_method {
@@ -815,6 +870,12 @@ impl
815870
zip: address.zip.clone(),
816871
country: address.country,
817872
}),
873+
user_fields: match item.router_data.request.metadata.clone() {
874+
Some(metadata) => Some(UserFields {
875+
user_field: Vec::<UserField>::foreign_try_from(metadata)?,
876+
}),
877+
None => None,
878+
},
818879
processing_options: None,
819880
subsequent_auth_information: None,
820881
authorization_indicator_type: match item.router_data.request.capture_method {

0 commit comments

Comments
 (0)