Skip to content

Commit 6678689

Browse files
feat(core): use redis as temp locker instead of basilisk (#2789)
1 parent 9cc8b93 commit 6678689

23 files changed

+554
-531
lines changed

crates/router/src/consts.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,6 @@ pub(crate) const MERCHANT_ID_FIELD_EXTENSION_ID: &str = "1.2.840.113635.100.6.32
4949
pub(crate) const METRICS_HOST_TAG_NAME: &str = "host";
5050
pub const MAX_ROUTING_CONFIGS_PER_MERCHANT: usize = 100;
5151
pub const ROUTING_CONFIG_ID_LENGTH: usize = 10;
52+
53+
pub const LOCKER_REDIS_PREFIX: &str = "LOCKER_PM_TOKEN";
54+
pub const LOCKER_REDIS_EXPIRY_SECONDS: u32 = 60 * 15; // 15 minutes

crates/router/src/core/payment_methods.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ use diesel_models::enums;
1313
use crate::{
1414
core::{errors::RouterResult, payments::helpers},
1515
routes::AppState,
16-
types::api::{self, payments},
16+
types::{
17+
api::{self, payments},
18+
domain,
19+
},
1720
};
1821

1922
pub struct Oss;
@@ -25,6 +28,7 @@ pub trait PaymentMethodRetrieve {
2528
state: &AppState,
2629
payment_intent: &PaymentIntent,
2730
payment_attempt: &PaymentAttempt,
31+
merchant_key_store: &domain::MerchantKeyStore,
2832
) -> RouterResult<(Option<payments::PaymentMethodData>, Option<String>)>;
2933
}
3034

@@ -35,6 +39,7 @@ impl PaymentMethodRetrieve for Oss {
3539
state: &AppState,
3640
payment_intent: &PaymentIntent,
3741
payment_attempt: &PaymentAttempt,
42+
merchant_key_store: &domain::MerchantKeyStore,
3843
) -> RouterResult<(Option<payments::PaymentMethodData>, Option<String>)> {
3944
match pm_data {
4045
pm_opt @ Some(pm @ api::PaymentMethodData::Card(_)) => {
@@ -44,6 +49,7 @@ impl PaymentMethodRetrieve for Oss {
4449
payment_intent,
4550
enums::PaymentMethod::Card,
4651
pm,
52+
merchant_key_store,
4753
)
4854
.await?;
4955

@@ -64,6 +70,7 @@ impl PaymentMethodRetrieve for Oss {
6470
payment_intent,
6571
enums::PaymentMethod::BankTransfer,
6672
pm,
73+
merchant_key_store,
6774
)
6875
.await?;
6976

@@ -76,6 +83,7 @@ impl PaymentMethodRetrieve for Oss {
7683
payment_intent,
7784
enums::PaymentMethod::Wallet,
7885
pm,
86+
merchant_key_store,
7987
)
8088
.await?;
8189

@@ -88,6 +96,7 @@ impl PaymentMethodRetrieve for Oss {
8896
payment_intent,
8997
enums::PaymentMethod::BankRedirect,
9098
pm,
99+
merchant_key_store,
91100
)
92101
.await?;
93102

crates/router/src/core/payment_methods/cards.rs

Lines changed: 26 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,7 +2009,7 @@ pub async fn list_customer_payment_method(
20092009
let hyperswitch_token = generate_id(consts::ID_LENGTH, "token");
20102010

20112011
let card = if pm.payment_method == enums::PaymentMethod::Card {
2012-
get_card_details(&pm, key, state, &hyperswitch_token).await?
2012+
get_card_details(&pm, key, state, &hyperswitch_token, &key_store).await?
20132013
} else {
20142014
None
20152015
};
@@ -2104,6 +2104,7 @@ async fn get_card_details(
21042104
key: &[u8],
21052105
state: &routes::AppState,
21062106
hyperswitch_token: &str,
2107+
key_store: &domain::MerchantKeyStore,
21072108
) -> errors::RouterResult<Option<api::CardDetailFromLocker>> {
21082109
let mut _card_decrypted =
21092110
decrypt::<serde_json::Value, masking::WithType>(pm.payment_method_data.clone(), key)
@@ -2120,14 +2121,15 @@ async fn get_card_details(
21202121
});
21212122

21222123
Ok(Some(
2123-
get_lookup_key_from_locker(state, hyperswitch_token, pm).await?,
2124+
get_lookup_key_from_locker(state, hyperswitch_token, pm, key_store).await?,
21242125
))
21252126
}
21262127

21272128
pub async fn get_lookup_key_from_locker(
21282129
state: &routes::AppState,
21292130
payment_token: &str,
21302131
pm: &storage::PaymentMethod,
2132+
merchant_key_store: &domain::MerchantKeyStore,
21312133
) -> errors::RouterResult<api::CardDetailFromLocker> {
21322134
let card = get_card_from_locker(
21332135
state,
@@ -2142,9 +2144,15 @@ pub async fn get_lookup_key_from_locker(
21422144
.change_context(errors::ApiErrorResponse::InternalServerError)
21432145
.attach_printable("Get Card Details Failed")?;
21442146
let card = card_detail.clone();
2145-
let resp =
2146-
BasiliskCardSupport::create_payment_method_data_in_locker(state, payment_token, card, pm)
2147-
.await?;
2147+
2148+
let resp = TempLockerCardSupport::create_payment_method_data_in_temp_locker(
2149+
state,
2150+
payment_token,
2151+
card,
2152+
pm,
2153+
merchant_key_store,
2154+
)
2155+
.await?;
21482156
Ok(resp)
21492157
}
21502158

@@ -2177,6 +2185,7 @@ pub async fn get_lookup_key_for_payout_method(
21772185
Some(payout_token.to_string()),
21782186
&pm_parsed,
21792187
Some(pm.customer_id.to_owned()),
2188+
key_store,
21802189
)
21812190
.await
21822191
.change_context(errors::ApiErrorResponse::InternalServerError)
@@ -2190,110 +2199,16 @@ pub async fn get_lookup_key_for_payout_method(
21902199
}
21912200
}
21922201

2193-
pub struct BasiliskCardSupport;
2202+
pub struct TempLockerCardSupport;
21942203

2195-
#[cfg(not(feature = "basilisk"))]
2196-
impl BasiliskCardSupport {
2197-
async fn create_payment_method_data_in_locker(
2198-
state: &routes::AppState,
2199-
payment_token: &str,
2200-
card: api::CardDetailFromLocker,
2201-
pm: &storage::PaymentMethod,
2202-
) -> errors::RouterResult<api::CardDetailFromLocker> {
2203-
let card_number = card.card_number.clone().get_required_value("card_number")?;
2204-
let card_exp_month = card
2205-
.expiry_month
2206-
.clone()
2207-
.expose_option()
2208-
.get_required_value("expiry_month")?;
2209-
let card_exp_year = card
2210-
.expiry_year
2211-
.clone()
2212-
.expose_option()
2213-
.get_required_value("expiry_year")?;
2214-
let card_holder_name = card
2215-
.card_holder_name
2216-
.clone()
2217-
.expose_option()
2218-
.unwrap_or_default();
2219-
let value1 = payment_methods::mk_card_value1(
2220-
card_number,
2221-
card_exp_year,
2222-
card_exp_month,
2223-
Some(card_holder_name),
2224-
None,
2225-
None,
2226-
None,
2227-
)
2228-
.change_context(errors::ApiErrorResponse::InternalServerError)
2229-
.attach_printable("Error getting Value1 for locker")?;
2230-
let value2 = payment_methods::mk_card_value2(
2231-
None,
2232-
None,
2233-
None,
2234-
Some(pm.customer_id.to_string()),
2235-
Some(pm.payment_method_id.to_string()),
2236-
)
2237-
.change_context(errors::ApiErrorResponse::InternalServerError)
2238-
.attach_printable("Error getting Value2 for locker")?;
2239-
2240-
let value1 = vault::VaultPaymentMethod::Card(value1);
2241-
let value2 = vault::VaultPaymentMethod::Card(value2);
2242-
2243-
let value1 = utils::Encode::<vault::VaultPaymentMethod>::encode_to_string_of_json(&value1)
2244-
.change_context(errors::ApiErrorResponse::InternalServerError)
2245-
.attach_printable("Wrapped value1 construction failed when saving card to locker")?;
2246-
2247-
let value2 = utils::Encode::<vault::VaultPaymentMethod>::encode_to_string_of_json(&value2)
2248-
.change_context(errors::ApiErrorResponse::InternalServerError)
2249-
.attach_printable("Wrapped value2 construction failed when saving card to locker")?;
2250-
2251-
let db_value = vault::MockTokenizeDBValue { value1, value2 };
2252-
2253-
let value_string =
2254-
utils::Encode::<vault::MockTokenizeDBValue>::encode_to_string_of_json(&db_value)
2255-
.change_context(errors::ApiErrorResponse::InternalServerError)
2256-
.attach_printable(
2257-
"Mock tokenize value construction failed when saving card to locker",
2258-
)?;
2259-
2260-
let db = &*state.store;
2261-
2262-
let already_present = db.find_config_by_key(payment_token).await;
2263-
2264-
if already_present.is_err() {
2265-
let config = storage::ConfigNew {
2266-
key: payment_token.to_string(),
2267-
config: value_string,
2268-
};
2269-
2270-
db.insert_config(config)
2271-
.await
2272-
.change_context(errors::ApiErrorResponse::InternalServerError)
2273-
.attach_printable("Mock tokenization save to db failed")?;
2274-
} else {
2275-
let config_update = storage::ConfigUpdate::Update {
2276-
config: Some(value_string),
2277-
};
2278-
2279-
db.update_config_by_key(payment_token, config_update)
2280-
.await
2281-
.change_context(errors::ApiErrorResponse::InternalServerError)
2282-
.attach_printable("Mock tokenization db update failed")?;
2283-
}
2284-
2285-
Ok(card)
2286-
}
2287-
}
2288-
2289-
#[cfg(feature = "basilisk")]
2290-
impl BasiliskCardSupport {
2204+
impl TempLockerCardSupport {
22912205
#[instrument(skip_all)]
2292-
async fn create_payment_method_data_in_locker(
2206+
async fn create_payment_method_data_in_temp_locker(
22932207
state: &routes::AppState,
22942208
payment_token: &str,
22952209
card: api::CardDetailFromLocker,
22962210
pm: &storage::PaymentMethod,
2211+
merchant_key_store: &domain::MerchantKeyStore,
22972212
) -> errors::RouterResult<api::CardDetailFromLocker> {
22982213
let card_number = card.card_number.clone().get_required_value("card_number")?;
22992214
let card_exp_month = card
@@ -2343,8 +2258,14 @@ impl BasiliskCardSupport {
23432258
.change_context(errors::ApiErrorResponse::InternalServerError)
23442259
.attach_printable("Wrapped value2 construction failed when saving card to locker")?;
23452260

2346-
let lookup_key =
2347-
vault::create_tokenize(state, value1, Some(value2), payment_token.to_string()).await?;
2261+
let lookup_key = vault::create_tokenize(
2262+
state,
2263+
value1,
2264+
Some(value2),
2265+
payment_token.to_string(),
2266+
merchant_key_store.key.get_inner(),
2267+
)
2268+
.await?;
23482269
vault::add_delete_tokenized_data_task(
23492270
&*state.store,
23502271
&lookup_key,

0 commit comments

Comments
 (0)