mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-02 21:07:58 +08:00
fix(router): validate each field for migration request body (#6525)
Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
@ -28,7 +28,7 @@ use common_utils::{
|
|||||||
consts,
|
consts,
|
||||||
crypto::{self, Encryptable},
|
crypto::{self, Encryptable},
|
||||||
encryption::Encryption,
|
encryption::Encryption,
|
||||||
ext_traits::{AsyncExt, BytesExt, Encode, StringExt, ValueExt},
|
ext_traits::{AsyncExt, BytesExt, ConfigExt, Encode, StringExt, ValueExt},
|
||||||
generate_id, id_type,
|
generate_id, id_type,
|
||||||
request::Request,
|
request::Request,
|
||||||
type_name,
|
type_name,
|
||||||
@ -55,6 +55,7 @@ use hyperswitch_domain_models::customer::CustomerUpdate;
|
|||||||
use kgraph_utils::transformers::IntoDirValue;
|
use kgraph_utils::transformers::IntoDirValue;
|
||||||
use masking::Secret;
|
use masking::Secret;
|
||||||
use router_env::{instrument, metrics::add_attributes, tracing};
|
use router_env::{instrument, metrics::add_attributes, tracing};
|
||||||
|
use serde_json::json;
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
@ -381,7 +382,7 @@ pub async fn migrate_payment_method(
|
|||||||
key_store: &domain::MerchantKeyStore,
|
key_store: &domain::MerchantKeyStore,
|
||||||
) -> errors::RouterResponse<api::PaymentMethodMigrateResponse> {
|
) -> errors::RouterResponse<api::PaymentMethodMigrateResponse> {
|
||||||
let mut req = req;
|
let mut req = req;
|
||||||
let card_details = req.card.as_ref().get_required_value("card")?;
|
let card_details = &req.card.get_required_value("card")?;
|
||||||
|
|
||||||
let card_number_validation_result =
|
let card_number_validation_result =
|
||||||
cards::CardNumber::from_str(card_details.card_number.peek());
|
cards::CardNumber::from_str(card_details.card_number.peek());
|
||||||
@ -780,17 +781,6 @@ pub async fn skip_locker_call_and_migrate_payment_method(
|
|||||||
|
|
||||||
let network_transaction_id = req.network_transaction_id.clone();
|
let network_transaction_id = req.network_transaction_id.clone();
|
||||||
|
|
||||||
migration_status.network_transaction_id_migrated(network_transaction_id.as_ref().map(|_| true));
|
|
||||||
|
|
||||||
migration_status.connector_mandate_details_migrated(
|
|
||||||
connector_mandate_details
|
|
||||||
.as_ref()
|
|
||||||
.map(|_| true)
|
|
||||||
.or_else(|| req.connector_mandate_details.as_ref().map(|_| false)),
|
|
||||||
);
|
|
||||||
|
|
||||||
migration_status.card_migrated(false);
|
|
||||||
|
|
||||||
let payment_method_id = generate_id(consts::ID_LENGTH, "pm");
|
let payment_method_id = generate_id(consts::ID_LENGTH, "pm");
|
||||||
|
|
||||||
let current_time = common_utils::date_time::now();
|
let current_time = common_utils::date_time::now();
|
||||||
@ -810,11 +800,11 @@ pub async fn skip_locker_call_and_migrate_payment_method(
|
|||||||
scheme: req.card_network.clone().or(card.scheme.clone()),
|
scheme: req.card_network.clone().or(card.scheme.clone()),
|
||||||
metadata: payment_method_metadata.map(Secret::new),
|
metadata: payment_method_metadata.map(Secret::new),
|
||||||
payment_method_data: payment_method_data_encrypted.map(Into::into),
|
payment_method_data: payment_method_data_encrypted.map(Into::into),
|
||||||
connector_mandate_details,
|
connector_mandate_details: connector_mandate_details.clone(),
|
||||||
customer_acceptance: None,
|
customer_acceptance: None,
|
||||||
client_secret: None,
|
client_secret: None,
|
||||||
status: enums::PaymentMethodStatus::Active,
|
status: enums::PaymentMethodStatus::Active,
|
||||||
network_transaction_id,
|
network_transaction_id: network_transaction_id.clone(),
|
||||||
payment_method_issuer_code: None,
|
payment_method_issuer_code: None,
|
||||||
accepted_currency: None,
|
accepted_currency: None,
|
||||||
token: None,
|
token: None,
|
||||||
@ -843,6 +833,21 @@ pub async fn skip_locker_call_and_migrate_payment_method(
|
|||||||
|
|
||||||
logger::debug!("Payment method inserted in db");
|
logger::debug!("Payment method inserted in db");
|
||||||
|
|
||||||
|
migration_status.network_transaction_id_migrated(
|
||||||
|
network_transaction_id.and_then(|val| (!val.is_empty_after_trim()).then_some(true)),
|
||||||
|
);
|
||||||
|
|
||||||
|
migration_status.connector_mandate_details_migrated(
|
||||||
|
connector_mandate_details
|
||||||
|
.clone()
|
||||||
|
.and_then(|val| if val == json!({}) { None } else { Some(true) })
|
||||||
|
.or_else(|| {
|
||||||
|
req.connector_mandate_details
|
||||||
|
.clone()
|
||||||
|
.and_then(|val| (!val.0.is_empty()).then_some(false))
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
if customer.default_payment_method_id.is_none() && req.payment_method.is_some() {
|
if customer.default_payment_method_id.is_none() && req.payment_method.is_some() {
|
||||||
let _ = set_default_payment_method(
|
let _ = set_default_payment_method(
|
||||||
state,
|
state,
|
||||||
@ -1166,10 +1171,14 @@ pub async fn get_client_secret_or_add_payment_method_for_migration(
|
|||||||
migration_status.connector_mandate_details_migrated(
|
migration_status.connector_mandate_details_migrated(
|
||||||
connector_mandate_details
|
connector_mandate_details
|
||||||
.clone()
|
.clone()
|
||||||
.map(|_| true)
|
.and_then(|val| (val != json!({})).then_some(true))
|
||||||
.or_else(|| req.connector_mandate_details.clone().map(|_| false)),
|
.or_else(|| {
|
||||||
|
req.connector_mandate_details
|
||||||
|
.clone()
|
||||||
|
.and_then(|val| (!val.0.is_empty()).then_some(false))
|
||||||
|
}),
|
||||||
);
|
);
|
||||||
|
//card is not migrated in this case
|
||||||
migration_status.card_migrated(false);
|
migration_status.card_migrated(false);
|
||||||
|
|
||||||
if res.status == enums::PaymentMethodStatus::AwaitingData {
|
if res.status == enums::PaymentMethodStatus::AwaitingData {
|
||||||
@ -1722,15 +1731,6 @@ pub async fn save_migration_payment_method(
|
|||||||
|
|
||||||
let network_transaction_id = req.network_transaction_id.clone();
|
let network_transaction_id = req.network_transaction_id.clone();
|
||||||
|
|
||||||
migration_status.network_transaction_id_migrated(network_transaction_id.as_ref().map(|_| true));
|
|
||||||
|
|
||||||
migration_status.connector_mandate_details_migrated(
|
|
||||||
connector_mandate_details
|
|
||||||
.as_ref()
|
|
||||||
.map(|_| true)
|
|
||||||
.or_else(|| req.connector_mandate_details.as_ref().map(|_| false)),
|
|
||||||
);
|
|
||||||
|
|
||||||
let response = match payment_method {
|
let response = match payment_method {
|
||||||
#[cfg(feature = "payouts")]
|
#[cfg(feature = "payouts")]
|
||||||
api_enums::PaymentMethod::BankTransfer => match req.bank_transfer.clone() {
|
api_enums::PaymentMethod::BankTransfer => match req.bank_transfer.clone() {
|
||||||
@ -1940,8 +1940,8 @@ pub async fn save_migration_payment_method(
|
|||||||
pm_metadata.cloned(),
|
pm_metadata.cloned(),
|
||||||
None,
|
None,
|
||||||
locker_id,
|
locker_id,
|
||||||
connector_mandate_details,
|
connector_mandate_details.clone(),
|
||||||
network_transaction_id,
|
network_transaction_id.clone(),
|
||||||
merchant_account.storage_scheme,
|
merchant_account.storage_scheme,
|
||||||
payment_method_billing_address.map(Into::into),
|
payment_method_billing_address.map(Into::into),
|
||||||
None,
|
None,
|
||||||
@ -1954,6 +1954,20 @@ pub async fn save_migration_payment_method(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
migration_status.card_migrated(true);
|
||||||
|
migration_status.network_transaction_id_migrated(
|
||||||
|
network_transaction_id.and_then(|val| (!val.is_empty_after_trim()).then_some(true)),
|
||||||
|
);
|
||||||
|
|
||||||
|
migration_status.connector_mandate_details_migrated(
|
||||||
|
connector_mandate_details
|
||||||
|
.and_then(|val| if val == json!({}) { None } else { Some(true) })
|
||||||
|
.or_else(|| {
|
||||||
|
req.connector_mandate_details
|
||||||
|
.and_then(|val| (!val.0.is_empty()).then_some(false))
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
Ok(services::ApplicationResponse::Json(resp))
|
Ok(services::ApplicationResponse::Json(resp))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user