mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-01 19:42:27 +08:00
feat(router): add card_info in payment_attempt table if not provided in request (#1538)
Co-authored-by: Sahkal Poddar <sahkal.poddar@juspay.in>
This commit is contained in:
@ -98,6 +98,9 @@ impl From<StripeCard> for payments::Card {
|
||||
card_cvc: card.cvc,
|
||||
card_issuer: None,
|
||||
card_network: None,
|
||||
bank_code: None,
|
||||
card_issuing_country: None,
|
||||
card_type: None,
|
||||
nick_name: None,
|
||||
}
|
||||
}
|
||||
|
||||
@ -89,6 +89,9 @@ impl From<StripeCard> for payments::Card {
|
||||
card_cvc: card.cvc,
|
||||
card_issuer: None,
|
||||
card_network: None,
|
||||
bank_code: None,
|
||||
card_issuing_country: None,
|
||||
card_type: None,
|
||||
nick_name: None,
|
||||
}
|
||||
}
|
||||
|
||||
@ -106,6 +106,9 @@ impl Vaultable for api::Card {
|
||||
card_cvc: value2.card_security_code.unwrap_or_default().into(),
|
||||
card_issuer: None,
|
||||
card_network: None,
|
||||
bank_code: None,
|
||||
card_issuing_country: None,
|
||||
card_type: None,
|
||||
nick_name: value1.nickname.map(masking::Secret::new),
|
||||
};
|
||||
|
||||
|
||||
@ -2449,3 +2449,93 @@ mod test {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn get_additional_payment_data(
|
||||
pm_data: &api_models::payments::PaymentMethodData,
|
||||
db: &dyn StorageInterface,
|
||||
) -> api_models::payments::AdditionalPaymentData {
|
||||
match pm_data {
|
||||
api_models::payments::PaymentMethodData::Card(card_data) => {
|
||||
if card_data.card_issuer.is_some()
|
||||
&& card_data.card_network.is_some()
|
||||
&& card_data.card_type.is_some()
|
||||
&& card_data.card_issuing_country.is_some()
|
||||
&& card_data.bank_code.is_some()
|
||||
{
|
||||
api_models::payments::AdditionalPaymentData::Card {
|
||||
card_issuer: card_data.card_issuer.to_owned(),
|
||||
card_network: card_data.card_network.clone(),
|
||||
card_type: card_data.card_type.to_owned(),
|
||||
card_issuing_country: card_data.card_issuing_country.to_owned(),
|
||||
bank_code: card_data.bank_code.to_owned(),
|
||||
}
|
||||
} else {
|
||||
let card_number = card_data.clone().card_number;
|
||||
let card_info = db
|
||||
.get_card_info(&card_number.get_card_isin())
|
||||
.await
|
||||
.map_err(|error| services::logger::warn!(card_info_error=?error))
|
||||
.ok()
|
||||
.flatten()
|
||||
.map(
|
||||
|card_info| api_models::payments::AdditionalPaymentData::Card {
|
||||
card_issuer: card_info.card_issuer,
|
||||
card_network: card_info
|
||||
.card_network
|
||||
.clone()
|
||||
.map(|network| network.foreign_into()),
|
||||
bank_code: card_info.bank_code,
|
||||
card_type: card_info.card_type,
|
||||
card_issuing_country: card_info.card_issuing_country,
|
||||
},
|
||||
);
|
||||
card_info.unwrap_or(api_models::payments::AdditionalPaymentData::Card {
|
||||
card_issuer: None,
|
||||
card_network: None,
|
||||
bank_code: None,
|
||||
card_type: None,
|
||||
card_issuing_country: None,
|
||||
})
|
||||
}
|
||||
}
|
||||
api_models::payments::PaymentMethodData::BankRedirect(bank_redirect_data) => {
|
||||
match bank_redirect_data {
|
||||
api_models::payments::BankRedirectData::Eps { bank_name, .. } => {
|
||||
api_models::payments::AdditionalPaymentData::BankRedirect {
|
||||
bank_name: bank_name.to_owned(),
|
||||
}
|
||||
}
|
||||
api_models::payments::BankRedirectData::Ideal { bank_name, .. } => {
|
||||
api_models::payments::AdditionalPaymentData::BankRedirect {
|
||||
bank_name: bank_name.to_owned(),
|
||||
}
|
||||
}
|
||||
_ => api_models::payments::AdditionalPaymentData::BankRedirect { bank_name: None },
|
||||
}
|
||||
}
|
||||
api_models::payments::PaymentMethodData::Wallet(_) => {
|
||||
api_models::payments::AdditionalPaymentData::Wallet {}
|
||||
}
|
||||
api_models::payments::PaymentMethodData::PayLater(_) => {
|
||||
api_models::payments::AdditionalPaymentData::PayLater {}
|
||||
}
|
||||
api_models::payments::PaymentMethodData::BankTransfer(_) => {
|
||||
api_models::payments::AdditionalPaymentData::BankTransfer {}
|
||||
}
|
||||
api_models::payments::PaymentMethodData::Crypto(_) => {
|
||||
api_models::payments::AdditionalPaymentData::Crypto {}
|
||||
}
|
||||
api_models::payments::PaymentMethodData::BankDebit(_) => {
|
||||
api_models::payments::AdditionalPaymentData::BankDebit {}
|
||||
}
|
||||
api_models::payments::PaymentMethodData::MandatePayment => {
|
||||
api_models::payments::AdditionalPaymentData::MandatePayment {}
|
||||
}
|
||||
api_models::payments::PaymentMethodData::Reward(_) => {
|
||||
api_models::payments::AdditionalPaymentData::Reward {}
|
||||
}
|
||||
api_models::payments::PaymentMethodData::Upi(_) => {
|
||||
api_models::payments::AdditionalPaymentData::Upi {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -397,7 +397,10 @@ impl<F: Clone> UpdateTracker<F, PaymentData<F>, api::PaymentsRequest> for Paymen
|
||||
let additional_pm_data = payment_data
|
||||
.payment_method_data
|
||||
.as_ref()
|
||||
.map(api_models::payments::AdditionalPaymentData::from)
|
||||
.async_map(|payment_method_data| async {
|
||||
helpers::get_additional_payment_data(payment_method_data, db).await
|
||||
})
|
||||
.await
|
||||
.as_ref()
|
||||
.map(Encode::<api_models::payments::AdditionalPaymentData>::encode_to_value)
|
||||
.transpose()
|
||||
|
||||
@ -55,7 +55,6 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
|
||||
let ephemeral_key = Self::get_ephemeral_key(request, state, merchant_account).await;
|
||||
let merchant_id = &merchant_account.merchant_id;
|
||||
let storage_scheme = merchant_account.storage_scheme;
|
||||
|
||||
let (payment_intent, payment_attempt, connector_response);
|
||||
|
||||
let money @ (amount, currency) = payments_create_request_validation(request)?;
|
||||
@ -116,7 +115,9 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
|
||||
payment_method_type,
|
||||
request,
|
||||
browser_info,
|
||||
)?,
|
||||
db,
|
||||
)
|
||||
.await?,
|
||||
storage_scheme,
|
||||
)
|
||||
.await
|
||||
@ -486,7 +487,8 @@ impl<F: Send + Clone> ValidateRequest<F, api::PaymentsRequest> for PaymentCreate
|
||||
|
||||
impl PaymentCreate {
|
||||
#[instrument(skip_all)]
|
||||
fn make_payment_attempt(
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub async fn make_payment_attempt(
|
||||
payment_id: &str,
|
||||
merchant_id: &str,
|
||||
money: (api::Amount, enums::Currency),
|
||||
@ -494,6 +496,7 @@ impl PaymentCreate {
|
||||
payment_method_type: Option<enums::PaymentMethodType>,
|
||||
request: &api::PaymentsRequest,
|
||||
browser_info: Option<serde_json::Value>,
|
||||
db: &dyn StorageInterface,
|
||||
) -> RouterResult<storage::PaymentAttemptNew> {
|
||||
let created_at @ modified_at @ last_synced = Some(common_utils::date_time::now());
|
||||
let status =
|
||||
@ -503,7 +506,10 @@ impl PaymentCreate {
|
||||
let additional_pm_data = request
|
||||
.payment_method_data
|
||||
.as_ref()
|
||||
.map(api_models::payments::AdditionalPaymentData::from)
|
||||
.async_map(|payment_method_data| async {
|
||||
helpers::get_additional_payment_data(payment_method_data, db).await
|
||||
})
|
||||
.await
|
||||
.as_ref()
|
||||
.map(Encode::<api_models::payments::AdditionalPaymentData>::encode_to_value)
|
||||
.transpose()
|
||||
|
||||
@ -429,7 +429,10 @@ impl<F: Clone> UpdateTracker<F, PaymentData<F>, api::PaymentsRequest> for Paymen
|
||||
let additional_pm_data = payment_data
|
||||
.payment_method_data
|
||||
.as_ref()
|
||||
.map(api_models::payments::AdditionalPaymentData::from)
|
||||
.async_map(|payment_method_data| async {
|
||||
helpers::get_additional_payment_data(payment_method_data, db).await
|
||||
})
|
||||
.await
|
||||
.as_ref()
|
||||
.map(Encode::<api_models::payments::AdditionalPaymentData>::encode_to_value)
|
||||
.transpose()
|
||||
|
||||
@ -233,6 +233,9 @@ mod payments_test {
|
||||
card_cvc: "123".to_string().into(),
|
||||
card_issuer: Some("HDFC".to_string()),
|
||||
card_network: Some(api_models::enums::CardNetwork::Visa),
|
||||
bank_code: None,
|
||||
card_issuing_country: None,
|
||||
card_type: None,
|
||||
nick_name: Some(masking::Secret::new("nick_name".into())),
|
||||
}
|
||||
}
|
||||
|
||||
@ -174,6 +174,7 @@ impl ForeignFrom<api_models::payments::MandateType> for storage_enums::MandateDa
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ForeignFrom<storage_enums::MandateDataType> for api_models::payments::MandateType {
|
||||
fn foreign_from(from: storage_enums::MandateDataType) -> Self {
|
||||
match from {
|
||||
@ -572,7 +573,7 @@ impl ForeignFrom<storage_models::cards_info::CardInfo>
|
||||
card_iin: item.card_iin,
|
||||
card_type: item.card_type,
|
||||
card_sub_type: item.card_subtype,
|
||||
card_network: item.card_network,
|
||||
card_network: item.card_network.map(|x| x.to_string()),
|
||||
card_issuer: item.card_issuer,
|
||||
card_issuing_country: item.card_issuing_country,
|
||||
}
|
||||
@ -619,3 +620,9 @@ impl TryFrom<domain::MerchantConnectorAccount> for api_models::admin::MerchantCo
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl ForeignFrom<storage_models::enums::CardNetwork> for api_models::enums::CardNetwork {
|
||||
fn foreign_from(source: storage_models::enums::CardNetwork) -> Self {
|
||||
frunk::labelled_convert_from(source)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user