Skip to content

Commit b2e0caf

Browse files
fix(router): update last used when the customer acceptance is passed in the recurring payment (#5116)
1 parent e3470a2 commit b2e0caf

File tree

4 files changed

+85
-32
lines changed

4 files changed

+85
-32
lines changed

crates/diesel_models/src/payment_method.rs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,13 @@ pub struct TokenizeCoreWorkflow {
9696

9797
#[derive(Debug, Serialize, Deserialize)]
9898
pub enum PaymentMethodUpdate {
99-
MetadataUpdate {
99+
MetadataUpdateAndLastUsed {
100100
metadata: Option<serde_json::Value>,
101+
last_used_at: PrimitiveDateTime,
102+
},
103+
UpdatePaymentMethodDataAndLastUsed {
104+
payment_method_data: Option<Encryption>,
105+
last_used_at: PrimitiveDateTime,
101106
},
102107
PaymentMethodDataUpdate {
103108
payment_method_data: Option<Encryption>,
@@ -191,10 +196,13 @@ impl PaymentMethodUpdateInternal {
191196
impl From<PaymentMethodUpdate> for PaymentMethodUpdateInternal {
192197
fn from(payment_method_update: PaymentMethodUpdate) -> Self {
193198
match payment_method_update {
194-
PaymentMethodUpdate::MetadataUpdate { metadata } => Self {
199+
PaymentMethodUpdate::MetadataUpdateAndLastUsed {
200+
metadata,
201+
last_used_at,
202+
} => Self {
195203
metadata,
196204
payment_method_data: None,
197-
last_used_at: None,
205+
last_used_at: Some(last_used_at),
198206
network_transaction_id: None,
199207
status: None,
200208
locker_id: None,
@@ -232,6 +240,22 @@ impl From<PaymentMethodUpdate> for PaymentMethodUpdateInternal {
232240
payment_method_issuer: None,
233241
payment_method_type: None,
234242
},
243+
PaymentMethodUpdate::UpdatePaymentMethodDataAndLastUsed {
244+
payment_method_data,
245+
last_used_at,
246+
} => Self {
247+
metadata: None,
248+
payment_method_data,
249+
last_used_at: Some(last_used_at),
250+
network_transaction_id: None,
251+
status: None,
252+
locker_id: None,
253+
payment_method: None,
254+
connector_mandate_details: None,
255+
updated_by: None,
256+
payment_method_issuer: None,
257+
payment_method_type: None,
258+
},
235259
PaymentMethodUpdate::NetworkTransactionIdAndStatusUpdate {
236260
network_transaction_id,
237261
status,

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

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,14 +1407,31 @@ pub async fn call_to_locker_hs<'a>(
14071407
Ok(stored_card)
14081408
}
14091409

1410-
pub async fn update_payment_method(
1410+
pub async fn update_payment_method_metadata_and_last_used(
14111411
db: &dyn db::StorageInterface,
14121412
pm: payment_method::PaymentMethod,
1413-
pm_metadata: serde_json::Value,
1413+
pm_metadata: Option<serde_json::Value>,
1414+
storage_scheme: MerchantStorageScheme,
1415+
) -> errors::CustomResult<(), errors::VaultError> {
1416+
let pm_update = payment_method::PaymentMethodUpdate::MetadataUpdateAndLastUsed {
1417+
metadata: pm_metadata,
1418+
last_used_at: common_utils::date_time::now(),
1419+
};
1420+
db.update_payment_method(pm, pm_update, storage_scheme)
1421+
.await
1422+
.change_context(errors::VaultError::UpdateInPaymentMethodDataTableFailed)?;
1423+
Ok(())
1424+
}
1425+
1426+
pub async fn update_payment_method_and_last_used(
1427+
db: &dyn db::StorageInterface,
1428+
pm: payment_method::PaymentMethod,
1429+
payment_method_update: Option<Encryption>,
14141430
storage_scheme: MerchantStorageScheme,
14151431
) -> errors::CustomResult<(), errors::VaultError> {
1416-
let pm_update = payment_method::PaymentMethodUpdate::MetadataUpdate {
1417-
metadata: Some(pm_metadata),
1432+
let pm_update = payment_method::PaymentMethodUpdate::UpdatePaymentMethodDataAndLastUsed {
1433+
payment_method_data: payment_method_update,
1434+
last_used_at: common_utils::date_time::now(),
14181435
};
14191436
db.update_payment_method(pm, pm_update, storage_scheme)
14201437
.await

crates/router/src/core/payments/operations/payment_response.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,14 @@ impl<F: Send + Clone> PostUpdateTracker<F, PaymentData<F>, types::PaymentsAuthor
114114
.get_payment_method_billing()
115115
.and_then(|billing_details| billing_details.address.as_ref())
116116
.and_then(|address| address.get_optional_full_name());
117+
let mut should_avoid_saving = false;
117118

118119
if let Some(payment_method_info) = &payment_data.payment_method_info {
119120
if payment_data.payment_intent.off_session.is_none() && resp.response.is_ok() {
121+
should_avoid_saving = resp.request.payment_method_type
122+
== Some(enums::PaymentMethodType::ApplePay)
123+
|| resp.request.payment_method_type
124+
== Some(enums::PaymentMethodType::GooglePay);
120125
payment_methods::cards::update_last_used_at(
121126
payment_method_info,
122127
state,
@@ -179,6 +184,12 @@ impl<F: Send + Clone> PostUpdateTracker<F, PaymentData<F>, types::PaymentsAuthor
179184
let (payment_method_id, _payment_method_status) = save_payment_call_future.await?;
180185
payment_data.payment_attempt.payment_method_id = payment_method_id;
181186
Ok(())
187+
} else if should_avoid_saving {
188+
if let Some(pm_info) = &payment_data.payment_method_info {
189+
payment_data.payment_attempt.payment_method_id =
190+
Some(pm_info.payment_method_id.clone());
191+
};
192+
Ok(())
182193
} else {
183194
// Save card flow
184195
let save_payment_data = tokenization::SavePaymentMethodData::from(resp);

crates/router/src/core/payments/tokenization.rs

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -272,20 +272,15 @@ where
272272
pm.metadata.as_ref(),
273273
connector_token,
274274
)?;
275-
if let Some(metadata) = pm_metadata {
276-
payment_methods::cards::update_payment_method(
277-
db,
278-
pm.clone(),
279-
metadata,
280-
merchant_account.storage_scheme,
281-
)
282-
.await
283-
.change_context(
284-
errors::ApiErrorResponse::InternalServerError,
285-
)
286-
.attach_printable("Failed to add payment method in db")?;
287-
};
288-
// update if its a off-session mit payment
275+
payment_methods::cards::update_payment_method_metadata_and_last_used(
276+
db,
277+
pm.clone(),
278+
pm_metadata,
279+
merchant_account.storage_scheme,
280+
)
281+
.await
282+
.change_context(errors::ApiErrorResponse::InternalServerError)
283+
.attach_printable("Failed to add payment method in db")?;
289284
if check_for_mit_mandates {
290285
let connector_mandate_details =
291286
update_connector_mandate_details_in_payment_method(
@@ -515,14 +510,10 @@ where
515510
.await
516511
.map(|details| details.into());
517512

518-
let pm_update =
519-
storage::PaymentMethodUpdate::PaymentMethodDataUpdate {
520-
payment_method_data: pm_data_encrypted,
521-
};
522-
523-
db.update_payment_method(
513+
payment_methods::cards::update_payment_method_and_last_used(
514+
db,
524515
existing_pm,
525-
pm_update,
516+
pm_data_encrypted,
526517
merchant_account.storage_scheme,
527518
)
528519
.await
@@ -532,7 +523,7 @@ where
532523
}
533524
},
534525
None => {
535-
let customer_saved_pm_id_option = if payment_method_type
526+
let customer_saved_pm_option = if payment_method_type
536527
== Some(api_models::enums::PaymentMethodType::ApplePay)
537528
|| payment_method_type
538529
== Some(api_models::enums::PaymentMethodType::GooglePay)
@@ -551,7 +542,7 @@ where
551542
.find(|payment_method| {
552543
payment_method.payment_method_type == payment_method_type
553544
})
554-
.map(|pm| pm.payment_method_id.clone())),
545+
.cloned()),
555546
Err(error) => {
556547
if error.current_context().is_db_not_found() {
557548
Ok(None)
@@ -570,8 +561,18 @@ where
570561
Ok(None)
571562
}?;
572563

573-
if let Some(customer_saved_pm_id) = customer_saved_pm_id_option {
574-
resp.payment_method_id = customer_saved_pm_id;
564+
if let Some(customer_saved_pm) = customer_saved_pm_option {
565+
payment_methods::cards::update_last_used_at(
566+
&customer_saved_pm,
567+
state,
568+
merchant_account.storage_scheme,
569+
)
570+
.await
571+
.map_err(|e| {
572+
logger::error!("Failed to update last used at: {:?}", e);
573+
})
574+
.ok();
575+
resp.payment_method_id = customer_saved_pm.payment_method_id;
575576
} else {
576577
let pm_metadata =
577578
create_payment_method_metadata(None, connector_token)?;

0 commit comments

Comments
 (0)