feat(router): add support for co-badged cards (#5801)

Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
AkshayaFoiger
2024-09-26 22:00:44 +05:30
committed by GitHub
parent 567ac8f1e4
commit 0add20930e
12 changed files with 394 additions and 150 deletions

View File

@ -8,6 +8,7 @@ use cards::CardNumber;
use common_utils::{
consts::default_payments_list_limit,
crypto,
errors::ValidationError,
ext_traits::{ConfigExt, Encode, ValueExt},
hashing::HashedString,
id_type,
@ -1396,8 +1397,23 @@ impl GetAddressFromPaymentMethodData for Card {
}
impl Card {
fn apply_additional_card_info(&self, additional_card_info: AdditionalCardInfo) -> Self {
Self {
fn apply_additional_card_info(
&self,
additional_card_info: AdditionalCardInfo,
) -> Result<Self, error_stack::Report<ValidationError>> {
let card_network = self
.card_network
.clone()
.or(additional_card_info.card_network.clone())
.map(|network| match self.card_number.is_cobadged_card() {
Ok(true) => Ok(Some(network)),
Ok(false) => Ok(None),
Err(e) => Err(e),
})
.transpose()?
.flatten();
Ok(Self {
card_number: self.card_number.clone(),
card_exp_month: self.card_exp_month.clone(),
card_exp_year: self.card_exp_year.clone(),
@ -1407,10 +1423,7 @@ impl Card {
.card_issuer
.clone()
.or(additional_card_info.card_issuer),
card_network: self
.card_network
.clone()
.or(additional_card_info.card_network),
card_network,
card_type: self.card_type.clone().or(additional_card_info.card_type),
card_issuing_country: self
.card_issuing_country
@ -1418,7 +1431,7 @@ impl Card {
.or(additional_card_info.card_issuing_country),
bank_code: self.bank_code.clone().or(additional_card_info.bank_code),
nick_name: self.nick_name.clone(),
}
})
}
}
@ -1858,16 +1871,16 @@ impl PaymentMethodData {
pub fn apply_additional_payment_data(
&self,
additional_payment_data: AdditionalPaymentData,
) -> Self {
) -> Result<Self, error_stack::Report<ValidationError>> {
if let AdditionalPaymentData::Card(additional_card_info) = additional_payment_data {
match self {
Self::Card(card) => {
Self::Card(card.apply_additional_card_info(*additional_card_info))
}
_ => self.to_owned(),
Self::Card(card) => Ok(Self::Card(
card.apply_additional_card_info(*additional_card_info)?,
)),
_ => Ok(self.to_owned()),
}
} else {
self.to_owned()
Ok(self.to_owned())
}
}