diff --git a/crates/common_utils/src/pii.rs b/crates/common_utils/src/pii.rs index 1889a5f3ae..066962af1d 100644 --- a/crates/common_utils/src/pii.rs +++ b/crates/common_utils/src/pii.rs @@ -244,12 +244,6 @@ impl TryFrom for Email { } } -impl From> for Email { - fn from(value: Secret) -> Self { - Self(value) - } -} - impl ops::Deref for Email { type Target = Secret; diff --git a/crates/router/src/core/admin.rs b/crates/router/src/core/admin.rs index 5381059320..2577bb83a3 100644 --- a/crates/router/src/core/admin.rs +++ b/crates/router/src/core/admin.rs @@ -13,6 +13,7 @@ use common_utils::{ use error_stack::{report, FutureExt, IntoReport, ResultExt}; use futures::future::try_join_all; use masking::{PeekInterface, Secret}; +use pm_auth::connector::plaid::transformers::PlaidAuthType; use uuid::Uuid; use crate::{ @@ -1830,8 +1831,10 @@ pub(crate) fn validate_auth_and_metadata_type( riskified::transformers::RiskifiedAuthType::try_from(val)?; Ok(()) } - api_enums::Connector::Plaid => Err(report!(errors::ConnectorError::InvalidConnectorName) - .attach_printable(format!("invalid connector name: {connector_name}"))), + api_enums::Connector::Plaid => { + PlaidAuthType::foreign_try_from(val)?; + Ok(()) + } } } diff --git a/crates/router/src/core/payment_methods.rs b/crates/router/src/core/payment_methods.rs index 14a39f1d95..c1617fa77c 100644 --- a/crates/router/src/core/payment_methods.rs +++ b/crates/router/src/core/payment_methods.rs @@ -43,6 +43,7 @@ pub trait PaymentMethodRetrieve { token: &storage::PaymentTokenData, payment_intent: &PaymentIntent, card_token_data: Option<&CardToken>, + customer: &Option, ) -> RouterResult>; } @@ -126,6 +127,7 @@ impl PaymentMethodRetrieve for Oss { token_data: &storage::PaymentTokenData, payment_intent: &PaymentIntent, card_token_data: Option<&CardToken>, + customer: &Option, ) -> RouterResult> { match token_data { storage::PaymentTokenData::TemporaryGeneric(generic_token) => { @@ -178,6 +180,7 @@ impl PaymentMethodRetrieve for Oss { merchant_key_store, auth_token, payment_intent, + customer, ) .await } diff --git a/crates/router/src/core/payments.rs b/crates/router/src/core/payments.rs index 04e947d36e..67328e3561 100644 --- a/crates/router/src/core/payments.rs +++ b/crates/router/src/core/payments.rs @@ -166,6 +166,7 @@ where &mut payment_data, &validate_result, &key_store, + &customer, ) .await?; @@ -1041,6 +1042,7 @@ where validate_result, &merchant_connector_account, key_store, + customer, ) .await?; @@ -1754,6 +1756,7 @@ pub async fn get_connector_tokenization_action_when_confirm_true( validate_result: &operations::ValidateResult<'_>, merchant_connector_account: &helpers::MerchantConnectorAccountType, merchant_key_store: &domain::MerchantKeyStore, + customer: &Option, ) -> RouterResult<(PaymentData, TokenizationAction)> where F: Send + Clone, @@ -1821,6 +1824,7 @@ where payment_data, validate_result.storage_scheme, merchant_key_store, + customer, ) .await?; payment_data.payment_method_data = payment_method_data; @@ -1836,6 +1840,7 @@ where payment_data, validate_result.storage_scheme, merchant_key_store, + customer, ) .await?; @@ -1873,6 +1878,7 @@ pub async fn tokenize_in_router_when_confirm_false( payment_data: &mut PaymentData, validate_result: &operations::ValidateResult<'_>, merchant_key_store: &domain::MerchantKeyStore, + customer: &Option, ) -> RouterResult> where F: Send + Clone, @@ -1887,6 +1893,7 @@ where payment_data, validate_result.storage_scheme, merchant_key_store, + customer, ) .await?; payment_data.payment_method_data = payment_method_data; diff --git a/crates/router/src/core/payments/helpers.rs b/crates/router/src/core/payments/helpers.rs index 97a9cbb9ea..d864cacc52 100644 --- a/crates/router/src/core/payments/helpers.rs +++ b/crates/router/src/core/payments/helpers.rs @@ -1532,6 +1532,7 @@ pub async fn make_pm_data<'a, F: Clone, R, Ctx: PaymentMethodRetrieve>( state: &'a AppState, payment_data: &mut PaymentData, merchant_key_store: &domain::MerchantKeyStore, + customer: &Option, ) -> RouterResult<( BoxedOperation<'a, F, R, Ctx>, Option, @@ -1621,6 +1622,7 @@ pub async fn make_pm_data<'a, F: Clone, R, Ctx: PaymentMethodRetrieve>( &hyperswitch_token, &payment_data.payment_intent, card_token_data.as_ref(), + customer, ) .await .attach_printable("in 'make_pm_data'")?; diff --git a/crates/router/src/core/payments/operations.rs b/crates/router/src/core/payments/operations.rs index cf0c0ab294..716b76120d 100644 --- a/crates/router/src/core/payments/operations.rs +++ b/crates/router/src/core/payments/operations.rs @@ -131,6 +131,7 @@ pub trait Domain: Send + Sync { payment_data: &mut PaymentData, storage_scheme: enums::MerchantStorageScheme, merchant_key_store: &domain::MerchantKeyStore, + customer: &Option, ) -> RouterResult<( BoxedOperation<'a, F, R, Ctx>, Option, @@ -251,11 +252,19 @@ where payment_data: &mut PaymentData, _storage_scheme: enums::MerchantStorageScheme, merchant_key_store: &domain::MerchantKeyStore, + customer: &Option, ) -> RouterResult<( BoxedOperation<'a, F, api::PaymentsRetrieveRequest, Ctx>, Option, )> { - helpers::make_pm_data(Box::new(self), state, payment_data, merchant_key_store).await + helpers::make_pm_data( + Box::new(self), + state, + payment_data, + merchant_key_store, + customer, + ) + .await } } @@ -301,6 +310,7 @@ where _payment_data: &mut PaymentData, _storage_scheme: enums::MerchantStorageScheme, _merchant_key_store: &domain::MerchantKeyStore, + _customer: &Option, ) -> RouterResult<( BoxedOperation<'a, F, api::PaymentsCaptureRequest, Ctx>, Option, @@ -363,6 +373,7 @@ where _payment_data: &mut PaymentData, _storage_scheme: enums::MerchantStorageScheme, _merchant_key_store: &domain::MerchantKeyStore, + _customer: &Option, ) -> RouterResult<( BoxedOperation<'a, F, api::PaymentsCancelRequest, Ctx>, Option, @@ -415,6 +426,7 @@ where _payment_data: &mut PaymentData, _storage_scheme: enums::MerchantStorageScheme, _merchant_key_store: &domain::MerchantKeyStore, + _customer: &Option, ) -> RouterResult<( BoxedOperation<'a, F, api::PaymentsRejectRequest, Ctx>, Option, diff --git a/crates/router/src/core/payments/operations/payment_approve.rs b/crates/router/src/core/payments/operations/payment_approve.rs index 1a6945b09c..cddbc89acf 100644 --- a/crates/router/src/core/payments/operations/payment_approve.rs +++ b/crates/router/src/core/payments/operations/payment_approve.rs @@ -315,12 +315,19 @@ impl Domain, _storage_scheme: storage_enums::MerchantStorageScheme, merchant_key_store: &domain::MerchantKeyStore, + customer: &Option, ) -> RouterResult<( BoxedOperation<'a, F, api::PaymentsRequest, Ctx>, Option, )> { - let (op, payment_method_data) = - helpers::make_pm_data(Box::new(self), state, payment_data, merchant_key_store).await?; + let (op, payment_method_data) = helpers::make_pm_data( + Box::new(self), + state, + payment_data, + merchant_key_store, + customer, + ) + .await?; utils::when(payment_method_data.is_none(), || { Err(errors::ApiErrorResponse::PaymentMethodNotFound) diff --git a/crates/router/src/core/payments/operations/payment_complete_authorize.rs b/crates/router/src/core/payments/operations/payment_complete_authorize.rs index abb08d14d9..adc137403e 100644 --- a/crates/router/src/core/payments/operations/payment_complete_authorize.rs +++ b/crates/router/src/core/payments/operations/payment_complete_authorize.rs @@ -311,12 +311,19 @@ impl Domain, _storage_scheme: storage_enums::MerchantStorageScheme, merchant_key_store: &domain::MerchantKeyStore, + customer: &Option, ) -> RouterResult<( BoxedOperation<'a, F, api::PaymentsRequest, Ctx>, Option, )> { - let (op, payment_method_data) = - helpers::make_pm_data(Box::new(self), state, payment_data, merchant_key_store).await?; + let (op, payment_method_data) = helpers::make_pm_data( + Box::new(self), + state, + payment_data, + merchant_key_store, + customer, + ) + .await?; Ok((op, payment_method_data)) } diff --git a/crates/router/src/core/payments/operations/payment_confirm.rs b/crates/router/src/core/payments/operations/payment_confirm.rs index 6a50abc543..0970a952c8 100644 --- a/crates/router/src/core/payments/operations/payment_confirm.rs +++ b/crates/router/src/core/payments/operations/payment_confirm.rs @@ -527,12 +527,13 @@ impl Domain, _storage_scheme: storage_enums::MerchantStorageScheme, key_store: &domain::MerchantKeyStore, + customer: &Option, ) -> RouterResult<( BoxedOperation<'a, F, api::PaymentsRequest, Ctx>, Option, )> { let (op, payment_method_data) = - helpers::make_pm_data(Box::new(self), state, payment_data, key_store).await?; + helpers::make_pm_data(Box::new(self), state, payment_data, key_store, customer).await?; utils::when(payment_method_data.is_none(), || { Err(errors::ApiErrorResponse::PaymentMethodNotFound) diff --git a/crates/router/src/core/payments/operations/payment_create.rs b/crates/router/src/core/payments/operations/payment_create.rs index 6f4f10e0ab..94436026dc 100644 --- a/crates/router/src/core/payments/operations/payment_create.rs +++ b/crates/router/src/core/payments/operations/payment_create.rs @@ -424,11 +424,19 @@ impl Domain, _storage_scheme: enums::MerchantStorageScheme, merchant_key_store: &domain::MerchantKeyStore, + customer: &Option, ) -> RouterResult<( BoxedOperation<'a, F, api::PaymentsRequest, Ctx>, Option, )> { - helpers::make_pm_data(Box::new(self), state, payment_data, merchant_key_store).await + helpers::make_pm_data( + Box::new(self), + state, + payment_data, + merchant_key_store, + customer, + ) + .await } #[instrument(skip_all)] diff --git a/crates/router/src/core/payments/operations/payment_session.rs b/crates/router/src/core/payments/operations/payment_session.rs index 49fad8f078..9a58dd5af7 100644 --- a/crates/router/src/core/payments/operations/payment_session.rs +++ b/crates/router/src/core/payments/operations/payment_session.rs @@ -312,6 +312,7 @@ where _payment_data: &mut PaymentData, _storage_scheme: storage_enums::MerchantStorageScheme, _merchant_key_store: &domain::MerchantKeyStore, + _customer: &Option, ) -> RouterResult<( BoxedOperation<'b, F, api::PaymentsSessionRequest, Ctx>, Option, diff --git a/crates/router/src/core/payments/operations/payment_start.rs b/crates/router/src/core/payments/operations/payment_start.rs index ea05cdcb74..557c5c0bd8 100644 --- a/crates/router/src/core/payments/operations/payment_start.rs +++ b/crates/router/src/core/payments/operations/payment_start.rs @@ -278,6 +278,7 @@ where payment_data: &mut PaymentData, _storage_scheme: storage_enums::MerchantStorageScheme, merchant_key_store: &domain::MerchantKeyStore, + customer: &Option, ) -> RouterResult<( BoxedOperation<'a, F, api::PaymentsStartRequest, Ctx>, Option, @@ -289,7 +290,14 @@ where .map(|connector_name| connector_name == *"bluesnap".to_string()) .unwrap_or(false) { - helpers::make_pm_data(Box::new(self), state, payment_data, merchant_key_store).await + helpers::make_pm_data( + Box::new(self), + state, + payment_data, + merchant_key_store, + customer, + ) + .await } else { Ok((Box::new(self), None)) } diff --git a/crates/router/src/core/payments/operations/payment_status.rs b/crates/router/src/core/payments/operations/payment_status.rs index e5db177c83..c6d9a30f0c 100644 --- a/crates/router/src/core/payments/operations/payment_status.rs +++ b/crates/router/src/core/payments/operations/payment_status.rs @@ -96,11 +96,19 @@ impl Domain, _storage_scheme: enums::MerchantStorageScheme, merchant_key_store: &domain::MerchantKeyStore, + customer: &Option, ) -> RouterResult<( BoxedOperation<'a, F, api::PaymentsRequest, Ctx>, Option, )> { - helpers::make_pm_data(Box::new(self), state, payment_data, merchant_key_store).await + helpers::make_pm_data( + Box::new(self), + state, + payment_data, + merchant_key_store, + customer, + ) + .await } #[instrument(skip_all)] diff --git a/crates/router/src/core/payments/operations/payment_update.rs b/crates/router/src/core/payments/operations/payment_update.rs index 5019a66233..5ed0c45d4e 100644 --- a/crates/router/src/core/payments/operations/payment_update.rs +++ b/crates/router/src/core/payments/operations/payment_update.rs @@ -428,11 +428,19 @@ impl Domain, _storage_scheme: storage_enums::MerchantStorageScheme, merchant_key_store: &domain::MerchantKeyStore, + customer: &Option, ) -> RouterResult<( BoxedOperation<'a, F, api::PaymentsRequest, Ctx>, Option, )> { - helpers::make_pm_data(Box::new(self), state, payment_data, merchant_key_store).await + helpers::make_pm_data( + Box::new(self), + state, + payment_data, + merchant_key_store, + customer, + ) + .await } #[instrument(skip_all)] diff --git a/crates/router/src/core/payments/operations/payments_incremental_authorization.rs b/crates/router/src/core/payments/operations/payments_incremental_authorization.rs index f707fe3a1d..51fdff77c3 100644 --- a/crates/router/src/core/payments/operations/payments_incremental_authorization.rs +++ b/crates/router/src/core/payments/operations/payments_incremental_authorization.rs @@ -309,6 +309,7 @@ impl _payment_data: &mut payments::PaymentData, _storage_scheme: enums::MerchantStorageScheme, _merchant_key_store: &domain::MerchantKeyStore, + _customer: &Option, ) -> RouterResult<( BoxedOperation<'a, F, PaymentsIncrementalAuthorizationRequest, Ctx>, Option, diff --git a/crates/router/src/core/pm_auth.rs b/crates/router/src/core/pm_auth.rs index 821f049d8c..0750ff82bf 100644 --- a/crates/router/src/core/pm_auth.rs +++ b/crates/router/src/core/pm_auth.rs @@ -52,6 +52,7 @@ use crate::{ storage, transformers::ForeignTryFrom, }, + utils::ext_traits::OptionExt, }; pub async fn create_link_token( @@ -618,6 +619,7 @@ pub async fn retrieve_payment_method_from_auth_service( key_store: &domain::MerchantKeyStore, auth_token: &payment_methods::BankAccountConnectorDetails, payment_intent: &PaymentIntent, + customer: &Option, ) -> RouterResult> { let db = state.store.as_ref(); @@ -710,10 +712,17 @@ pub async fn retrieve_payment_method_from_auth_service( last_name, } }); + + let email = customer + .as_ref() + .and_then(|customer| customer.email.clone()) + .map(common_utils::pii::Email::from) + .get_required_value("email")?; + let payment_method_data = PaymentMethodData::BankDebit(BankDebitData::AchBankDebit { billing_details: BankDebitBilling { name: name.unwrap_or_default(), - email: common_utils::pii::Email::from(masking::Secret::new("".to_string())), + email, address: address_details, }, account_number: masking::Secret::new(bank_account.account_number.clone()), diff --git a/crates/router/tests/connectors/utils.rs b/crates/router/tests/connectors/utils.rs index c27a648a30..db82cd7e03 100644 --- a/crates/router/tests/connectors/utils.rs +++ b/crates/router/tests/connectors/utils.rs @@ -458,7 +458,7 @@ pub trait ConnectorActions: Connector { customer_details: Some(payments::CustomerDetails { customer_id: core_utils::get_or_generate_id("customer_id", &None, "cust_").ok(), name: Some(Secret::new("John Doe".to_string())), - email: TryFrom::try_from("john.doe@example".to_string()).ok(), + email: Email::from_str("john.doe@example").ok(), phone: Some(Secret::new("620874518".to_string())), phone_country_code: Some("+31".to_string()), }), @@ -996,7 +996,7 @@ impl Default for CustomerType { let data = types::ConnectorCustomerData { payment_method_data: types::api::PaymentMethodData::Card(CCardType::default().0), description: None, - email: Some(Email::from(Secret::new("test@juspay.in".to_string()))), + email: Email::from_str("test@juspay.in").ok(), phone: None, name: None, preprocessing_id: None,