fix(router): Add additional card info in payment response (#1745)

Co-authored-by: Sahkal Poddar <sahkal.poddar@juspay.in>
This commit is contained in:
Sahkal Poddar
2023-07-21 02:23:00 +05:30
committed by GitHub
parent 3c5d725cc2
commit a891708f67
4 changed files with 143 additions and 74 deletions

View File

@ -6,7 +6,7 @@ use common_utils::{
ext_traits::Encode,
pii::{self, Email},
};
use masking::{PeekInterface, Secret};
use masking::Secret;
use router_derive::Setter;
use time::PrimitiveDateTime;
use url::Url;
@ -723,16 +723,25 @@ pub enum PaymentMethodData {
Upi(UpiData),
}
#[derive(Default, Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[serde(rename_all = "snake_case")]
pub struct AdditionalCardInfo {
pub card_issuer: Option<String>,
pub card_network: Option<api_enums::CardNetwork>,
pub card_type: Option<String>,
pub card_issuing_country: Option<String>,
pub bank_code: Option<String>,
pub last4: String,
pub card_isin: String,
pub card_exp_month: Secret<String>,
pub card_exp_year: Secret<String>,
pub card_holder_name: Secret<String>,
}
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "snake_case")]
pub enum AdditionalPaymentData {
Card {
card_issuer: Option<String>,
card_network: Option<api_enums::CardNetwork>,
card_type: Option<String>,
card_issuing_country: Option<String>,
bank_code: Option<String>,
},
Card(Box<AdditionalCardInfo>),
BankRedirect {
bank_name: Option<api_enums::BankNames>,
},
@ -1136,11 +1145,17 @@ pub struct ApplepayPaymentMethod {
pub pm_type: String,
}
#[derive(Eq, PartialEq, Clone, Debug, serde::Serialize)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize)]
pub struct CardResponse {
last4: String,
exp_month: String,
exp_year: String,
pub last4: String,
pub card_type: Option<String>,
pub card_network: Option<api_enums::CardNetwork>,
pub card_issuer: Option<String>,
pub card_issuing_country: Option<String>,
pub card_isin: String,
pub card_exp_month: Secret<String>,
pub card_exp_year: Secret<String>,
pub card_holder_name: Secret<String>,
}
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize, ToSchema)]
@ -1150,21 +1165,21 @@ pub struct RewardData {
pub merchant_id: String,
}
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize)]
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PaymentMethodDataResponse {
#[serde(rename = "card")]
Card(CardResponse),
BankTransfer(BankTransferData),
Wallet(WalletData),
PayLater(PayLaterData),
BankTransfer,
Wallet,
PayLater,
Paypal,
BankRedirect(BankRedirectData),
Crypto(CryptoData),
BankDebit(BankDebitData),
BankRedirect,
Crypto,
BankDebit,
MandatePayment,
Reward(RewardData),
Upi(UpiData),
Reward,
Upi,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize, ToSchema)]
@ -1802,35 +1817,35 @@ impl From<PaymentsStartRequest> for PaymentsRequest {
}
}
impl From<Card> for CardResponse {
fn from(card: Card) -> Self {
let card_number_length = card.card_number.peek().clone().len();
impl From<AdditionalCardInfo> for CardResponse {
fn from(card: AdditionalCardInfo) -> Self {
Self {
last4: card.card_number.peek().clone()[card_number_length - 4..card_number_length]
.to_string(),
exp_month: card.card_exp_month.peek().clone(),
exp_year: card.card_exp_year.peek().clone(),
last4: card.last4,
card_type: card.card_type,
card_network: card.card_network,
card_issuer: card.card_issuer,
card_issuing_country: card.card_issuing_country,
card_isin: card.card_isin,
card_exp_month: card.card_exp_month,
card_exp_year: card.card_exp_year,
card_holder_name: card.card_holder_name,
}
}
}
impl From<PaymentMethodData> for PaymentMethodDataResponse {
fn from(payment_method_data: PaymentMethodData) -> Self {
impl From<AdditionalPaymentData> for PaymentMethodDataResponse {
fn from(payment_method_data: AdditionalPaymentData) -> Self {
match payment_method_data {
PaymentMethodData::Card(card) => Self::Card(CardResponse::from(card)),
PaymentMethodData::PayLater(pay_later_data) => Self::PayLater(pay_later_data),
PaymentMethodData::Wallet(wallet_data) => Self::Wallet(wallet_data),
PaymentMethodData::BankRedirect(bank_redirect_data) => {
Self::BankRedirect(bank_redirect_data)
}
PaymentMethodData::BankTransfer(bank_transfer_data) => {
Self::BankTransfer(*bank_transfer_data)
}
PaymentMethodData::Crypto(crpto_data) => Self::Crypto(crpto_data),
PaymentMethodData::BankDebit(bank_debit_data) => Self::BankDebit(bank_debit_data),
PaymentMethodData::MandatePayment => Self::MandatePayment,
PaymentMethodData::Reward(reward_data) => Self::Reward(reward_data),
PaymentMethodData::Upi(upi_data) => Self::Upi(upi_data),
AdditionalPaymentData::Card(card) => Self::Card(CardResponse::from(*card)),
AdditionalPaymentData::PayLater {} => Self::PayLater,
AdditionalPaymentData::Wallet {} => Self::Wallet,
AdditionalPaymentData::BankRedirect { .. } => Self::BankRedirect,
AdditionalPaymentData::Crypto {} => Self::Crypto,
AdditionalPaymentData::BankDebit {} => Self::BankDebit,
AdditionalPaymentData::MandatePayment {} => Self::MandatePayment,
AdditionalPaymentData::Reward {} => Self::Reward,
AdditionalPaymentData::Upi {} => Self::Upi,
AdditionalPaymentData::BankTransfer {} => Self::BankTransfer,
}
}
}