mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-11-01 02:57:02 +08:00 
			
		
		
		
	refactor(payment_methods): update connector_mandate_details for card metadata changes (#6848)
				
					
				
			This commit is contained in:
		| @ -200,6 +200,7 @@ impl<F: Send + Clone> PostUpdateTracker<F, PaymentData<F>, types::PaymentsAuthor | |||||||
|             payment_method_billing_address, |             payment_method_billing_address, | ||||||
|             business_profile, |             business_profile, | ||||||
|             connector_mandate_reference_id.clone(), |             connector_mandate_reference_id.clone(), | ||||||
|  |             merchant_connector_id.clone(), | ||||||
|         )); |         )); | ||||||
|  |  | ||||||
|         let is_connector_mandate = resp.request.customer_acceptance.is_some() |         let is_connector_mandate = resp.request.customer_acceptance.is_some() | ||||||
| @ -315,6 +316,7 @@ impl<F: Send + Clone> PostUpdateTracker<F, PaymentData<F>, types::PaymentsAuthor | |||||||
|                         payment_method_billing_address.as_ref(), |                         payment_method_billing_address.as_ref(), | ||||||
|                         &business_profile, |                         &business_profile, | ||||||
|                         connector_mandate_reference_id, |                         connector_mandate_reference_id, | ||||||
|  |                         merchant_connector_id.clone(), | ||||||
|                     )) |                     )) | ||||||
|                     .await; |                     .await; | ||||||
|  |  | ||||||
| @ -1099,6 +1101,7 @@ impl<F: Clone> PostUpdateTracker<F, PaymentData<F>, types::SetupMandateRequestDa | |||||||
|             payment_method_billing_address, |             payment_method_billing_address, | ||||||
|             business_profile, |             business_profile, | ||||||
|             connector_mandate_reference_id, |             connector_mandate_reference_id, | ||||||
|  |             merchant_connector_id.clone(), | ||||||
|         )) |         )) | ||||||
|         .await?; |         .await?; | ||||||
|  |  | ||||||
|  | |||||||
| @ -83,6 +83,7 @@ pub async fn save_payment_method<FData>( | |||||||
|     payment_method_billing_address: Option<&hyperswitch_domain_models::address::Address>, |     payment_method_billing_address: Option<&hyperswitch_domain_models::address::Address>, | ||||||
|     business_profile: &domain::Profile, |     business_profile: &domain::Profile, | ||||||
|     mut original_connector_mandate_reference_id: Option<ConnectorMandateReferenceId>, |     mut original_connector_mandate_reference_id: Option<ConnectorMandateReferenceId>, | ||||||
|  |     merchant_connector_id: Option<id_type::MerchantConnectorAccountId>, | ||||||
| ) -> RouterResult<SavePaymentMethodDataResponse> | ) -> RouterResult<SavePaymentMethodDataResponse> | ||||||
| where | where | ||||||
|     FData: mandate::MandateBehaviour + Clone, |     FData: mandate::MandateBehaviour + Clone, | ||||||
| @ -458,7 +459,41 @@ where | |||||||
|                                 resp.payment_method_id = payment_method_id; |                                 resp.payment_method_id = payment_method_id; | ||||||
|  |  | ||||||
|                                 let existing_pm = match payment_method { |                                 let existing_pm = match payment_method { | ||||||
|                                     Ok(pm) => Ok(pm), |                                     Ok(pm) => { | ||||||
|  |                                         let mandate_details =    pm | ||||||
|  |                                         .connector_mandate_details | ||||||
|  |                                         .clone() | ||||||
|  |                                         .map(|val| { | ||||||
|  |                                             val.parse_value::<diesel_models::PaymentsMandateReference>( | ||||||
|  |                                                 "PaymentsMandateReference", | ||||||
|  |                                             ) | ||||||
|  |                                         }) | ||||||
|  |                                         .transpose() | ||||||
|  |                                         .change_context(errors::ApiErrorResponse::InternalServerError) | ||||||
|  |                                         .attach_printable("Failed to deserialize to Payment Mandate Reference ")?; | ||||||
|  |                                         if let Some((mandate_details, merchant_connector_id)) = | ||||||
|  |                                             mandate_details.zip(merchant_connector_id) | ||||||
|  |                                         { | ||||||
|  |                                             let connector_mandate_details = | ||||||
|  |                                                 update_connector_mandate_details_status( | ||||||
|  |                                                     merchant_connector_id, | ||||||
|  |                                                     mandate_details, | ||||||
|  |                                                     ConnectorMandateStatus::Inactive, | ||||||
|  |                                                 )?; | ||||||
|  |                                             payment_methods::cards::update_payment_method_connector_mandate_details( | ||||||
|  |                                             state, | ||||||
|  |                                             key_store, | ||||||
|  |                                             db, | ||||||
|  |                                             pm.clone(), | ||||||
|  |                                             connector_mandate_details, | ||||||
|  |                                             merchant_account.storage_scheme, | ||||||
|  |                                         ) | ||||||
|  |                                         .await | ||||||
|  |                                         .change_context(errors::ApiErrorResponse::InternalServerError) | ||||||
|  |                                         .attach_printable("Failed to add payment method in db")?; | ||||||
|  |                                         } | ||||||
|  |                                         Ok(pm) | ||||||
|  |                                     } | ||||||
|                                     Err(err) => { |                                     Err(err) => { | ||||||
|                                         if err.current_context().is_db_not_found() { |                                         if err.current_context().is_db_not_found() { | ||||||
|                                             payment_methods::cards::create_payment_method( |                                             payment_methods::cards::create_payment_method( | ||||||
| @ -1260,3 +1295,37 @@ pub fn update_connector_mandate_details( | |||||||
|  |  | ||||||
|     Ok(connector_mandate_details) |     Ok(connector_mandate_details) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #[cfg(feature = "v1")] | ||||||
|  | pub fn update_connector_mandate_details_status( | ||||||
|  |     merchant_connector_id: id_type::MerchantConnectorAccountId, | ||||||
|  |     mut payment_mandate_reference: diesel_models::PaymentsMandateReference, | ||||||
|  |     status: ConnectorMandateStatus, | ||||||
|  | ) -> RouterResult<Option<serde_json::Value>> { | ||||||
|  |     let mandate_reference = { | ||||||
|  |         payment_mandate_reference | ||||||
|  |             .entry(merchant_connector_id) | ||||||
|  |             .and_modify(|pm| { | ||||||
|  |                 let update_rec = diesel_models::PaymentsMandateReferenceRecord { | ||||||
|  |                     connector_mandate_id: pm.connector_mandate_id.clone(), | ||||||
|  |                     payment_method_type: pm.payment_method_type, | ||||||
|  |                     original_payment_authorized_amount: pm.original_payment_authorized_amount, | ||||||
|  |                     original_payment_authorized_currency: pm.original_payment_authorized_currency, | ||||||
|  |                     mandate_metadata: pm.mandate_metadata.clone(), | ||||||
|  |                     connector_mandate_status: Some(status), | ||||||
|  |                     connector_mandate_request_reference_id: pm | ||||||
|  |                         .connector_mandate_request_reference_id | ||||||
|  |                         .clone(), | ||||||
|  |                 }; | ||||||
|  |                 *pm = update_rec | ||||||
|  |             }); | ||||||
|  |         Some(payment_mandate_reference) | ||||||
|  |     }; | ||||||
|  |     let connector_mandate_details = mandate_reference | ||||||
|  |         .map(|mandate| mandate.encode_to_value()) | ||||||
|  |         .transpose() | ||||||
|  |         .change_context(errors::ApiErrorResponse::InternalServerError) | ||||||
|  |         .attach_printable("Unable to serialize customer acceptance to value")?; | ||||||
|  |  | ||||||
|  |     Ok(connector_mandate_details) | ||||||
|  | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Amisha Prabhat
					Amisha Prabhat