Skip to content

Commit

Permalink
feat(router): Override the setup_future_usage to on_session based…
Browse files Browse the repository at this point in the history
… on the merchant config (#5016)
  • Loading branch information
ShankarSinghC authored Jun 18, 2024
1 parent 91c8af6 commit a7ad790
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 28 deletions.
19 changes: 19 additions & 0 deletions crates/router/src/core/payments.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3558,6 +3558,25 @@ pub async fn decide_multiplex_connector_for_normal_or_recurring_payment<F: Clone
Ok(ConnectorCallType::PreDetermined(chosen_connector_data))
}
_ => {
let skip_saving_wallet_at_connector_optional =
helpers::config_skip_saving_wallet_at_connector(
&*state.store,
&payment_data.payment_intent.merchant_id,
)
.await?;

if let Some(skip_saving_wallet_at_connector) = skip_saving_wallet_at_connector_optional
{
if let Some(payment_method_type) = payment_data.payment_attempt.payment_method_type
{
if skip_saving_wallet_at_connector.contains(&payment_method_type) {
logger::debug!("Override setup_future_usage from off_session to on_session based on the merchant's skip_saving_wallet_at_connector configuration to avoid creating a connector mandate.");
payment_data.payment_intent.setup_future_usage =
Some(enums::FutureUsage::OnSession);
}
}
};

let first_choice = connectors
.first()
.ok_or(errors::ApiErrorResponse::IncorrectPaymentMethodConfiguration)
Expand Down
23 changes: 23 additions & 0 deletions crates/router/src/core/payments/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4793,3 +4793,26 @@ pub async fn get_payment_external_authentication_flow_during_confirm<F: Clone>(
pub fn get_redis_key_for_extended_card_info(merchant_id: &str, payment_id: &str) -> String {
format!("{merchant_id}_{payment_id}_extended_card_info")
}

pub async fn config_skip_saving_wallet_at_connector(
db: &dyn StorageInterface,
merchant_id: &String,
) -> CustomResult<Option<Vec<storage_enums::PaymentMethodType>>, errors::ApiErrorResponse> {
let config = db
.find_config_by_key_unwrap_or(
format!("skip_saving_wallet_at_connector_{}", merchant_id).as_str(),
Some("[]".to_string()),
)
.await;
Ok(match config {
Ok(conf) => Some(
serde_json::from_str::<Vec<storage_enums::PaymentMethodType>>(&conf.config)
.change_context(errors::ApiErrorResponse::InternalServerError)
.attach_printable("skip_save_wallet_at_connector config parsing failed")?,
),
Err(err) => {
logger::error!("{err}");
None
}
})
}
100 changes: 72 additions & 28 deletions crates/router/src/core/payments/tokenization.rs
Original file line number Diff line number Diff line change
Expand Up @@ -515,35 +515,79 @@ where
}
},
None => {
let pm_metadata = create_payment_method_metadata(None, connector_token)?;

locker_id = resp.payment_method.and_then(|pm| {
if pm == PaymentMethod::Card {
Some(resp.payment_method_id)
} else {
None
let customer_apple_pay_saved_pm_id_option = if payment_method_type
== Some(api_models::enums::PaymentMethodType::ApplePay)
{
match state
.store
.find_payment_method_by_customer_id_merchant_id_list(
&customer_id,
merchant_id,
None,
)
.await
{
Ok(customer_payment_methods) => Ok(customer_payment_methods
.iter()
.find(|payment_method| {
payment_method.payment_method_type
== Some(api_models::enums::PaymentMethodType::ApplePay)
})
.map(|pm| pm.payment_method_id.clone())),
Err(error) => {
if error.current_context().is_db_not_found() {
Ok(None)
} else {
Err(error)
.change_context(
errors::ApiErrorResponse::InternalServerError,
)
.attach_printable(
"failed to find payment methods for a customer",
)
}
}
}
});

resp.payment_method_id = generate_id(consts::ID_LENGTH, "pm");
payment_methods::cards::create_payment_method(
db,
&payment_method_create_request,
&customer_id,
&resp.payment_method_id,
locker_id,
merchant_id,
pm_metadata,
customer_acceptance,
pm_data_encrypted,
key_store,
connector_mandate_details,
None,
network_transaction_id,
merchant_account.storage_scheme,
encrypted_payment_method_billing_address,
)
.await?;
} else {
Ok(None)
}?;

if let Some(customer_apple_pay_saved_pm_id) =
customer_apple_pay_saved_pm_id_option
{
resp.payment_method_id = customer_apple_pay_saved_pm_id;
} else {
let pm_metadata =
create_payment_method_metadata(None, connector_token)?;

locker_id = resp.payment_method.and_then(|pm| {
if pm == PaymentMethod::Card {
Some(resp.payment_method_id)
} else {
None
}
});

resp.payment_method_id = generate_id(consts::ID_LENGTH, "pm");
payment_methods::cards::create_payment_method(
db,
&payment_method_create_request,
&customer_id,
&resp.payment_method_id,
locker_id,
merchant_id,
pm_metadata,
customer_acceptance,
pm_data_encrypted,
key_store,
connector_mandate_details,
None,
network_transaction_id,
merchant_account.storage_scheme,
encrypted_payment_method_billing_address,
)
.await?;
};
}
}

Expand Down

0 comments on commit a7ad790

Please sign in to comment.