feat(events): Add payment metadata to hyperswitch-payment-intent-events (#5170)

Co-authored-by: Narayan Bhat <48803246+Narayanbhat166@users.noreply.github.com>
Co-authored-by: Sampras Lopes <Sampras.lopes@juspay.in>
Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
Sandeep Kumar
2024-07-05 20:15:25 +05:30
committed by GitHub
parent 16e8f4b263
commit 5ebfbaf199
25 changed files with 146 additions and 119 deletions

View File

@ -261,7 +261,7 @@ pub struct StripePaymentIntentRequest {
pub shipping: Option<Shipping>,
pub statement_descriptor: Option<String>,
pub statement_descriptor_suffix: Option<String>,
pub metadata: Option<SecretSerdeValue>,
pub metadata: Option<serde_json::Value>,
pub client_secret: Option<masking::Secret<String>>,
pub payment_method_options: Option<StripePaymentMethodOptions>,
pub merchant_connector_details: Option<admin::MerchantConnectorDetailsWrap>,
@ -478,7 +478,7 @@ pub struct StripePaymentIntentResponse {
pub customer: Option<id_type::CustomerId>,
pub refunds: Option<Vec<stripe_refunds::StripeRefundResponse>>,
pub mandate: Option<String>,
pub metadata: Option<SecretSerdeValue>,
pub metadata: Option<serde_json::Value>,
pub charges: Charges,
pub connector: Option<String>,
pub description: Option<String>,

View File

@ -458,7 +458,7 @@ pub struct StripeSetupIntentResponse {
pub object: String,
pub status: StripeSetupStatus,
pub client_secret: Option<masking::Secret<String>>,
pub metadata: Option<secret::SecretSerdeValue>,
pub metadata: Option<Value>,
#[serde(with = "common_utils::custom_serde::iso8601::option")]
pub created: Option<time::PrimitiveDateTime>,
pub customer: Option<id_type::CustomerId>,

View File

@ -2610,7 +2610,7 @@ impl<'a>
channel: None,
shopper_statement: item.router_data.request.statement_descriptor.clone(),
shopper_ip: item.router_data.request.get_ip_address_as_optional(),
metadata: item.router_data.request.metadata.clone(),
metadata: item.router_data.request.metadata.clone().map(Into::into),
merchant_order_reference: item.router_data.request.merchant_order_reference_id.clone(),
})
}
@ -2673,7 +2673,7 @@ impl<'a>
channel: None,
shopper_statement: item.router_data.request.statement_descriptor.clone(),
shopper_ip: item.router_data.request.get_ip_address_as_optional(),
metadata: item.router_data.request.metadata.clone(),
metadata: item.router_data.request.metadata.clone().map(Into::into),
merchant_order_reference: item.router_data.request.merchant_order_reference_id.clone(),
})
}
@ -2727,7 +2727,7 @@ impl<'a>
channel: None,
shopper_statement: item.router_data.request.statement_descriptor.clone(),
shopper_ip: item.router_data.request.get_ip_address_as_optional(),
metadata: item.router_data.request.metadata.clone(),
metadata: item.router_data.request.metadata.clone().map(Into::into),
merchant_order_reference: item.router_data.request.merchant_order_reference_id.clone(),
};
Ok(request)
@ -2782,7 +2782,7 @@ impl<'a>
channel: None,
shopper_statement: item.router_data.request.statement_descriptor.clone(),
shopper_ip: item.router_data.request.get_ip_address_as_optional(),
metadata: item.router_data.request.metadata.clone(),
metadata: item.router_data.request.metadata.clone().map(Into::into),
merchant_order_reference: item.router_data.request.merchant_order_reference_id.clone(),
};
Ok(request)
@ -2833,7 +2833,7 @@ impl<'a>
channel: None,
shopper_statement: item.router_data.request.statement_descriptor.clone(),
shopper_ip: item.router_data.request.get_ip_address_as_optional(),
metadata: item.router_data.request.metadata.clone(),
metadata: item.router_data.request.metadata.clone().map(Into::into),
merchant_order_reference: item.router_data.request.merchant_order_reference_id.clone(),
};
Ok(request)
@ -2884,7 +2884,7 @@ impl<'a>
social_security_number: None,
shopper_statement: item.router_data.request.statement_descriptor.clone(),
shopper_ip: item.router_data.request.get_ip_address_as_optional(),
metadata: item.router_data.request.metadata.clone(),
metadata: item.router_data.request.metadata.clone().map(Into::into),
merchant_order_reference: item.router_data.request.merchant_order_reference_id.clone(),
};
Ok(request)
@ -2945,7 +2945,7 @@ impl<'a>
channel: None,
shopper_statement: item.router_data.request.statement_descriptor.clone(),
shopper_ip: item.router_data.request.get_ip_address_as_optional(),
metadata: item.router_data.request.metadata.clone(),
metadata: item.router_data.request.metadata.clone().map(Into::into),
merchant_order_reference: item.router_data.request.merchant_order_reference_id.clone(),
})
}
@ -3041,7 +3041,7 @@ impl<'a>
channel,
shopper_statement: item.router_data.request.statement_descriptor.clone(),
shopper_ip: item.router_data.request.get_ip_address_as_optional(),
metadata: item.router_data.request.metadata.clone(),
metadata: item.router_data.request.metadata.clone().map(Into::into),
merchant_order_reference: item.router_data.request.merchant_order_reference_id.clone(),
})
}
@ -3117,7 +3117,7 @@ impl<'a>
channel: None,
shopper_statement: item.router_data.request.statement_descriptor.clone(),
shopper_ip: item.router_data.request.get_ip_address_as_optional(),
metadata: item.router_data.request.metadata.clone(),
metadata: item.router_data.request.metadata.clone().map(Into::into),
merchant_order_reference: item.router_data.request.merchant_order_reference_id.clone(),
})
}
@ -3176,7 +3176,7 @@ impl<'a>
social_security_number: None,
shopper_statement: item.router_data.request.statement_descriptor.clone(),
shopper_ip: item.router_data.request.get_ip_address_as_optional(),
metadata: item.router_data.request.metadata.clone(),
metadata: item.router_data.request.metadata.clone().map(Into::into),
merchant_order_reference: item.router_data.request.merchant_order_reference_id.clone(),
})
}

View File

@ -941,10 +941,12 @@ impl
specification_version: three_ds_info.three_ds_data.specification_version,
});
let merchant_defined_information =
item.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(metadata.peek().to_owned())
});
let merchant_defined_information = item
.router_data
.request
.metadata
.clone()
.map(Vec::<MerchantDefinedInformation>::foreign_from);
Ok(Self {
processing_information,
@ -976,10 +978,12 @@ impl
let payment_information = PaymentInformation::try_from(&ccard)?;
let processing_information = ProcessingInformation::try_from((item, None, None))?;
let client_reference_information = ClientReferenceInformation::from(item);
let merchant_defined_information =
item.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(metadata.peek().to_owned())
});
let merchant_defined_information = item
.router_data
.request
.metadata
.clone()
.map(Vec::<MerchantDefinedInformation>::foreign_from);
Ok(Self {
processing_information,
@ -1017,10 +1021,12 @@ impl
))?;
let client_reference_information = ClientReferenceInformation::from(item);
let payment_information = PaymentInformation::try_from(&apple_pay_data)?;
let merchant_defined_information =
item.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(metadata.peek().to_owned())
});
let merchant_defined_information = item
.router_data
.request
.metadata
.clone()
.map(Vec::<MerchantDefinedInformation>::foreign_from);
let ucaf_collection_indicator = match apple_pay_wallet_data
.payment_method
.network
@ -1068,10 +1074,12 @@ impl
let processing_information =
ProcessingInformation::try_from((item, Some(PaymentSolution::GooglePay), None))?;
let client_reference_information = ClientReferenceInformation::from(item);
let merchant_defined_information =
item.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(metadata.peek().to_owned())
});
let merchant_defined_information = item
.router_data
.request
.metadata
.clone()
.map(Vec::<MerchantDefinedInformation>::foreign_from);
Ok(Self {
processing_information,
@ -1132,7 +1140,7 @@ impl TryFrom<&BankOfAmericaRouterData<&types::PaymentsAuthorizeRouterData>>
let merchant_defined_information =
item.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(
metadata.peek().to_owned(),
metadata,
)
});
let ucaf_collection_indicator = match apple_pay_data
@ -1307,10 +1315,12 @@ impl
payment_instrument,
}));
let client_reference_information = ClientReferenceInformation::from(item);
let merchant_defined_information =
item.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(metadata.peek().to_owned())
});
let merchant_defined_information = item
.router_data
.request
.metadata
.clone()
.map(Vec::<MerchantDefinedInformation>::foreign_from);
Ok(Self {
processing_information,
payment_information,
@ -2610,10 +2620,12 @@ impl TryFrom<&BankOfAmericaRouterData<&types::PaymentsCaptureRouterData>>
fn try_from(
value: &BankOfAmericaRouterData<&types::PaymentsCaptureRouterData>,
) -> Result<Self, Self::Error> {
let merchant_defined_information =
value.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(metadata.peek().to_owned())
});
let merchant_defined_information = value
.router_data
.request
.metadata
.clone()
.map(Vec::<MerchantDefinedInformation>::foreign_from);
Ok(Self {
order_information: OrderInformation {
amount_details: Amount {
@ -2653,10 +2665,12 @@ impl TryFrom<&BankOfAmericaRouterData<&types::PaymentsCancelRouterData>>
fn try_from(
value: &BankOfAmericaRouterData<&types::PaymentsCancelRouterData>,
) -> Result<Self, Self::Error> {
let merchant_defined_information =
value.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(metadata.peek().to_owned())
});
let merchant_defined_information = value
.router_data
.request
.metadata
.clone()
.map(Vec::<MerchantDefinedInformation>::foreign_from);
Ok(Self {
client_reference_information: ClientReferenceInformation {
code: Some(value.router_data.connector_request_reference_id.clone()),

View File

@ -202,7 +202,7 @@ impl TryFrom<&BillwerkRouterData<&types::PaymentsAuthorizeRouterData>> for Billw
first_name: item.router_data.get_optional_billing_first_name(),
last_name: item.router_data.get_optional_billing_last_name(),
},
metadata: item.router_data.request.metadata.clone(),
metadata: item.router_data.request.metadata.clone().map(Into::into),
settle: item.router_data.request.is_auto_capture()?,
})
}

View File

@ -258,7 +258,7 @@ impl TryFrom<&BluesnapRouterData<&types::PaymentsAuthorizeRouterData>> for Blues
.metadata
.as_ref()
.map(|metadata| BluesnapMetadata {
meta_data: Vec::<RequestMetadata>::foreign_from(metadata.peek().to_owned()),
meta_data: Vec::<RequestMetadata>::foreign_from(metadata.to_owned()),
});
let (payment_method, card_holder_info) = match item
@ -609,7 +609,7 @@ impl TryFrom<&BluesnapRouterData<&types::PaymentsCompleteAuthorizeRouterData>>
.metadata
.as_ref()
.map(|metadata| BluesnapMetadata {
meta_data: Vec::<RequestMetadata>::foreign_from(metadata.peek().to_owned()),
meta_data: Vec::<RequestMetadata>::foreign_from(metadata.to_owned()),
});
let token = item

View File

@ -418,7 +418,7 @@ impl TryFrom<&CheckoutRouterData<&types::PaymentsAuthorizeRouterData>> for Payme
let connector_auth = &item.router_data.connector_auth_type;
let auth_type: CheckoutAuthType = connector_auth.try_into()?;
let processing_channel_id = auth_type.processing_channel_id;
let metadata = item.router_data.request.metadata.clone();
let metadata = item.router_data.request.metadata.clone().map(Into::into);
Ok(Self {
source: source_var,
amount: item.amount.to_owned(),

View File

@ -991,10 +991,12 @@ impl
let processing_information = ProcessingInformation::try_from((item, None, card_type))?;
let client_reference_information = ClientReferenceInformation::from(item);
let merchant_defined_information =
item.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(metadata.peek().to_owned())
});
let merchant_defined_information = item
.router_data
.request
.metadata
.clone()
.map(Vec::<MerchantDefinedInformation>::foreign_from);
let consumer_authentication_information = item
.router_data
@ -1097,10 +1099,12 @@ impl
veres_enrolled: None,
});
let merchant_defined_information =
item.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(metadata.peek().to_owned())
});
let merchant_defined_information = item
.router_data
.request
.metadata
.clone()
.map(Vec::<MerchantDefinedInformation>::foreign_from);
Ok(Self {
processing_information,
@ -1149,10 +1153,12 @@ impl
expiration_month,
},
}));
let merchant_defined_information =
item.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(metadata.peek().to_owned())
});
let merchant_defined_information = item
.router_data
.request
.metadata
.clone()
.map(Vec::<MerchantDefinedInformation>::foreign_from);
let ucaf_collection_indicator = match apple_pay_wallet_data
.payment_method
.network
@ -1211,10 +1217,12 @@ impl
let processing_information =
ProcessingInformation::try_from((item, Some(PaymentSolution::GooglePay), None))?;
let client_reference_information = ClientReferenceInformation::from(item);
let merchant_defined_information =
item.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(metadata.peek().to_owned())
});
let merchant_defined_information = item
.router_data
.request
.metadata
.clone()
.map(Vec::<MerchantDefinedInformation>::foreign_from);
Ok(Self {
processing_information,
@ -1284,7 +1292,7 @@ impl TryFrom<&CybersourceRouterData<&types::PaymentsAuthorizeRouterData>>
let merchant_defined_information =
item.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(
metadata.peek().to_owned(),
metadata,
)
});
let ucaf_collection_indicator = match apple_pay_data
@ -1411,10 +1419,12 @@ impl
payment_instrument,
}));
let client_reference_information = ClientReferenceInformation::from(item);
let merchant_defined_information =
item.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(metadata.peek().to_owned())
});
let merchant_defined_information = item
.router_data
.request
.metadata
.clone()
.map(Vec::<MerchantDefinedInformation>::foreign_from);
Ok(Self {
processing_information,
payment_information,
@ -1510,10 +1520,12 @@ impl TryFrom<&CybersourceRouterData<&types::PaymentsCaptureRouterData>>
fn try_from(
item: &CybersourceRouterData<&types::PaymentsCaptureRouterData>,
) -> Result<Self, Self::Error> {
let merchant_defined_information =
item.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(metadata.peek().to_owned())
});
let merchant_defined_information = item
.router_data
.request
.metadata
.clone()
.map(Vec::<MerchantDefinedInformation>::foreign_from);
Ok(Self {
processing_information: ProcessingInformation {
capture_options: Some(CaptureOptions {
@ -1602,10 +1614,12 @@ impl TryFrom<&CybersourceRouterData<&types::PaymentsCancelRouterData>> for Cyber
fn try_from(
value: &CybersourceRouterData<&types::PaymentsCancelRouterData>,
) -> Result<Self, Self::Error> {
let merchant_defined_information =
value.router_data.request.metadata.clone().map(|metadata| {
Vec::<MerchantDefinedInformation>::foreign_from(metadata.peek().to_owned())
});
let merchant_defined_information = value
.router_data
.request
.metadata
.clone()
.map(Vec::<MerchantDefinedInformation>::foreign_from);
Ok(Self {
client_reference_information: ClientReferenceInformation {
code: Some(value.router_data.connector_request_reference_id.clone()),

View File

@ -1,12 +1,7 @@
use api_models::webhooks;
use cards::CardNumber;
use common_enums::CountryAlpha2;
use common_utils::{
errors::CustomResult,
ext_traits::XmlExt,
pii::{self, Email},
types::FloatMajorUnit,
};
use common_utils::{errors::CustomResult, ext_traits::XmlExt, pii::Email, types::FloatMajorUnit};
use error_stack::{report, Report, ResultExt};
use masking::{ExposeInterface, PeekInterface, Secret};
use serde::{Deserialize, Serialize};
@ -431,8 +426,8 @@ pub struct NmiMerchantDefinedField {
}
impl NmiMerchantDefinedField {
pub fn new(metadata: &pii::SecretSerdeValue) -> Self {
let metadata_as_string = metadata.peek().to_string();
pub fn new(metadata: &serde_json::Value) -> Self {
let metadata_as_string = metadata.to_string();
let hash_map: std::collections::BTreeMap<String, serde_json::Value> =
serde_json::from_str(&metadata_as_string).unwrap_or(std::collections::BTreeMap::new());
let inner = hash_map

View File

@ -1,6 +1,6 @@
use common_utils::{ext_traits::Encode, pii, types::StringMajorUnit};
use error_stack::ResultExt;
use masking::{ExposeInterface, PeekInterface, Secret};
use masking::{ExposeInterface, Secret};
use serde::{Deserialize, Serialize};
use crate::{
@ -107,8 +107,8 @@ fn get_value_as_string(value: &serde_json::Value) -> String {
}
impl NoonOrderNvp {
pub fn new(metadata: &pii::SecretSerdeValue) -> Self {
let metadata_as_string = metadata.peek().to_string();
pub fn new(metadata: &serde_json::Value) -> Self {
let metadata_as_string = metadata.to_string();
let hash_map: std::collections::BTreeMap<String, serde_json::Value> =
serde_json::from_str(&metadata_as_string).unwrap_or(std::collections::BTreeMap::new());
let inner = hash_map

View File

@ -1840,7 +1840,8 @@ impl TryFrom<(&types::PaymentsAuthorizeRouterData, MinorUnit)> for PaymentIntent
}
});
let meta_data = get_transaction_metadata(item.request.metadata.clone(), order_id);
let meta_data =
get_transaction_metadata(item.request.metadata.clone().map(Into::into), order_id);
// We pass browser_info only when payment_data exists.
// Hence, we're pass Null during recurring payments as payment_method_data[type] is not passed
@ -3334,7 +3335,7 @@ impl TryFrom<(&types::PaymentsAuthorizeRouterData, MinorUnit)> for ChargesReques
let amount = data.1;
let order_id = value.connector_request_reference_id.clone();
let meta_data = Some(get_transaction_metadata(
value.request.metadata.clone(),
value.request.metadata.clone().map(Into::into),
order_id,
));
Ok(Self {

View File

@ -922,16 +922,14 @@ impl PaymentsAuthorizeRequestData for types::PaymentsAuthorizeData {
}
fn get_metadata_as_object(&self) -> Option<pii::SecretSerdeValue> {
self.metadata
.clone()
.and_then(|meta_data| match meta_data.peek() {
serde_json::Value::Null
| serde_json::Value::Bool(_)
| serde_json::Value::Number(_)
| serde_json::Value::String(_)
| serde_json::Value::Array(_) => None,
serde_json::Value::Object(_) => Some(meta_data),
})
self.metadata.clone().and_then(|meta_data| match meta_data {
serde_json::Value::Null
| serde_json::Value::Bool(_)
| serde_json::Value::Number(_)
| serde_json::Value::String(_)
| serde_json::Value::Array(_) => None,
serde_json::Value::Object(_) => Some(meta_data.into()),
})
}
fn get_authentication_data(&self) -> Result<AuthenticationData, Error> {

View File

@ -320,7 +320,7 @@ where
.or_else(||
// when the order_details are present within the meta_data, we need to take those to support backward compatibility
payment_data.payment_intent.metadata.clone().and_then(|meta| {
let order_details = meta.peek().get("order_details").to_owned();
let order_details = meta.get("order_details").to_owned();
order_details.map(|order| vec![masking::Secret::new(order.to_owned())])
}))
.map(|order_details_value| {

View File

@ -1690,7 +1690,7 @@ impl<F: Clone> TryFrom<PaymentAdditionalData<'_, F>> for types::SetupMandateRequ
Some(RequestIncrementalAuthorization::True)
| Some(RequestIncrementalAuthorization::Default)
),
metadata: payment_data.payment_intent.metadata.clone(),
metadata: payment_data.payment_intent.metadata.clone().map(Into::into),
})
}
}

View File

@ -15,6 +15,7 @@ pub struct KafkaPaymentIntent<'a> {
pub customer_id: Option<&'a id_type::CustomerId>,
pub description: Option<&'a String>,
pub return_url: Option<&'a String>,
pub metadata: Option<String>,
pub connector_id: Option<&'a String>,
pub statement_descriptor_name: Option<&'a String>,
pub statement_descriptor_suffix: Option<&'a String>,
@ -47,6 +48,7 @@ impl<'a> KafkaPaymentIntent<'a> {
customer_id: intent.customer_id.as_ref(),
description: intent.description.as_ref(),
return_url: intent.return_url.as_ref(),
metadata: intent.metadata.as_ref().map(|x| x.to_string()),
connector_id: intent.connector_id.as_ref(),
statement_descriptor_name: intent.statement_descriptor_name.as_ref(),
statement_descriptor_suffix: intent.statement_descriptor_suffix.as_ref(),

View File

@ -16,6 +16,7 @@ pub struct KafkaPaymentIntentEvent<'a> {
pub customer_id: Option<&'a id_type::CustomerId>,
pub description: Option<&'a String>,
pub return_url: Option<&'a String>,
pub metadata: Option<String>,
pub connector_id: Option<&'a String>,
pub statement_descriptor_name: Option<&'a String>,
pub statement_descriptor_suffix: Option<&'a String>,
@ -48,6 +49,7 @@ impl<'a> KafkaPaymentIntentEvent<'a> {
customer_id: intent.customer_id.as_ref(),
description: intent.description.as_ref(),
return_url: intent.return_url.as_ref(),
metadata: intent.metadata.as_ref().map(|x| x.to_string()),
connector_id: intent.connector_id.as_ref(),
statement_descriptor_name: intent.statement_descriptor_name.as_ref(),
statement_descriptor_suffix: intent.statement_descriptor_suffix.as_ref(),