mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-01 19:42:27 +08:00
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:
@ -1,6 +1,10 @@
|
||||
use std::{fmt, ops::Deref, str::FromStr};
|
||||
use std::{collections::HashMap, fmt, ops::Deref, str::FromStr};
|
||||
|
||||
use common_utils::errors::ValidationError;
|
||||
use error_stack::report;
|
||||
use masking::{PeekInterface, Strategy, StrongSecret, WithType};
|
||||
use regex::Regex;
|
||||
use router_env::once_cell::sync::Lazy;
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
use router_env::{logger, which as router_env_which, Env};
|
||||
use serde::{Deserialize, Deserializer, Serialize};
|
||||
@ -46,6 +50,54 @@ impl CardNumber {
|
||||
.rev()
|
||||
.collect::<String>()
|
||||
}
|
||||
pub fn is_cobadged_card(&self) -> Result<bool, error_stack::Report<ValidationError>> {
|
||||
/// Regex to identify card networks
|
||||
static CARD_NETWORK_REGEX: Lazy<HashMap<&str, Result<Regex, regex::Error>>> = Lazy::new(
|
||||
|| {
|
||||
let mut map = HashMap::new();
|
||||
map.insert("Mastercard", Regex::new(r"^(5[1-5][0-9]{14}|2(2(2[1-9]|[3-9][0-9])|[3-6][0-9][0-9]|7([0-1][0-9]|20))[0-9]{12})$"));
|
||||
map.insert("American Express", Regex::new(r"^3[47][0-9]{13}$"));
|
||||
map.insert("Visa", Regex::new(r"^4[0-9]{12}(?:[0-9]{3})?$"));
|
||||
map.insert("Discover", Regex::new(r"^65[4-9][0-9]{13}|64[4-9][0-9]{13}|6011[0-9]{12}|(622(?:12[6-9]|1[3-9][0-9]|[2-8][0-9][0-9]|9[01][0-9]|92[0-5])[0-9]{10})$"));
|
||||
map.insert(
|
||||
"Maestro",
|
||||
Regex::new(r"^(5018|5081|5044|504681|504993|5020|502260|5038|603845|603123|6304|6759|676[1-3]|6220|504834|504817|504645|504775|600206|627741)"),
|
||||
);
|
||||
map.insert(
|
||||
"RuPay",
|
||||
Regex::new(r"^(508227|508[5-9]|603741|60698[5-9]|60699|607[0-8]|6079[0-7]|60798[0-4]|60800[1-9]|6080[1-9]|608[1-4]|608500|6521[5-9]|652[2-9]|6530|6531[0-4]|817290|817368|817378|353800)"),
|
||||
);
|
||||
map.insert("Diners Club", Regex::new(r"^(36|38|30[0-5])"));
|
||||
map.insert(
|
||||
"JCB",
|
||||
Regex::new(r"^(3(?:088|096|112|158|337|5(?:2[89]|[3-8][0-9]))\d{12})$"),
|
||||
);
|
||||
map.insert("CarteBlanche", Regex::new(r"^389[0-9]{11}$"));
|
||||
map.insert("Sodex", Regex::new(r"^(637513)"));
|
||||
map.insert("BAJAJ", Regex::new(r"^(203040)"));
|
||||
map
|
||||
},
|
||||
);
|
||||
let mut no_of_supported_card_networks = 0;
|
||||
|
||||
let card_number_str = self.get_card_no();
|
||||
for (_, regex) in CARD_NETWORK_REGEX.iter() {
|
||||
let card_regex = match regex.as_ref() {
|
||||
Ok(regex) => Ok(regex),
|
||||
Err(_) => Err(report!(ValidationError::InvalidValue {
|
||||
message: "Invalid regex expression".into(),
|
||||
})),
|
||||
}?;
|
||||
|
||||
if card_regex.is_match(&card_number_str) {
|
||||
no_of_supported_card_networks += 1;
|
||||
if no_of_supported_card_networks > 1 {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(no_of_supported_card_networks > 1)
|
||||
}
|
||||
}
|
||||
|
||||
impl FromStr for CardNumber {
|
||||
|
||||
Reference in New Issue
Block a user