diff --git a/crates/router/src/core/payments/helpers.rs b/crates/router/src/core/payments/helpers.rs index 4ba21a17ee..559b6b1157 100644 --- a/crates/router/src/core/payments/helpers.rs +++ b/crates/router/src/core/payments/helpers.rs @@ -306,33 +306,19 @@ fn validate_new_mandate_request(req: api::MandateValidationFields) -> RouterResu Ok(()) } -pub fn validate_customer_id_mandatory_cases_api( - shipping: &Option, - billing: &Option, - setup_future_usage: &Option, +pub fn validate_customer_id_mandatory_cases( + has_shipping: bool, + has_billing: bool, + has_setup_future_usage: bool, customer_id: &Option, ) -> RouterResult<()> { - match (shipping, billing, setup_future_usage, customer_id) { - (Some(_), _, _, None) | (_, Some(_), _, None) | (_, _, Some(_), None) => { - Err(errors::ApiErrorResponse::PreconditionFailed { - message: "customer_id is mandatory when shipping or billing \ - address is given or when setup_future_usage is given" - .to_string(), - }) - .into_report() - } - _ => Ok(()), - } -} - -pub fn validate_customer_id_mandatory_cases_storage( - shipping: &Option, - billing: &Option, - setup_future_usage: &Option, - customer_id: &Option, -) -> RouterResult<()> { - match (shipping, billing, setup_future_usage, customer_id) { - (Some(_), _, _, None) | (_, Some(_), _, None) | (_, _, Some(_), None) => { + match ( + has_shipping, + has_billing, + has_setup_future_usage, + customer_id, + ) { + (true, _, _, None) | (_, true, _, None) | (_, _, true, None) => { Err(errors::ApiErrorResponse::PreconditionFailed { message: "customer_id is mandatory when shipping or billing \ address is given or when setup_future_usage is given" diff --git a/crates/router/src/core/payments/operations/payment_confirm.rs b/crates/router/src/core/payments/operations/payment_confirm.rs index d52d899cb9..c5bb482abc 100644 --- a/crates/router/src/core/payments/operations/payment_confirm.rs +++ b/crates/router/src/core/payments/operations/payment_confirm.rs @@ -106,6 +106,16 @@ impl GetTracker, api::PaymentsRequest> for Pa currency = payment_attempt.currency.get_required_value("currency")?; amount = payment_attempt.amount.into(); + helpers::validate_customer_id_mandatory_cases( + request.shipping.is_some(), + request.billing.is_some(), + request.setup_future_usage.is_some(), + &payment_intent + .customer_id + .clone() + .or_else(|| request.customer_id.clone()), + )?; + let shipping_address = helpers::get_address_for_payment_request( db, request.shipping.as_ref(), @@ -123,18 +133,6 @@ impl GetTracker, api::PaymentsRequest> for Pa ) .await?; - helpers::validate_customer_id_mandatory_cases_storage( - &shipping_address, - &billing_address, - &payment_intent - .setup_future_usage - .or_else(|| request.setup_future_usage.map(ForeignInto::foreign_into)), - &payment_intent - .customer_id - .clone() - .or_else(|| request.customer_id.clone()), - )?; - connector_response = db .find_connector_response_by_payment_id_merchant_id_attempt_id( &payment_attempt.payment_id, diff --git a/crates/router/src/core/payments/operations/payment_create.rs b/crates/router/src/core/payments/operations/payment_create.rs index b1036f1519..29b6a615b4 100644 --- a/crates/router/src/core/payments/operations/payment_create.rs +++ b/crates/router/src/core/payments/operations/payment_create.rs @@ -378,6 +378,13 @@ impl ValidateRequest for PaymentCreate &mandate_type, &request.payment_token, )?; + + helpers::validate_customer_id_mandatory_cases( + request.shipping.is_some(), + request.billing.is_some(), + request.setup_future_usage.is_some(), + &request.customer_id, + )?; } Ok(( diff --git a/crates/router/src/core/payments/operations/payment_update.rs b/crates/router/src/core/payments/operations/payment_update.rs index 8b63c831d6..1d937af7f8 100644 --- a/crates/router/src/core/payments/operations/payment_update.rs +++ b/crates/router/src/core/payments/operations/payment_update.rs @@ -93,6 +93,18 @@ impl GetTracker, api::PaymentsRequest> for Pa payment_intent.client_secret.as_ref(), )?; + if request.confirm.unwrap_or(false) { + helpers::validate_customer_id_mandatory_cases( + request.shipping.is_some(), + request.billing.is_some(), + request.setup_future_usage.is_some(), + &payment_intent + .customer_id + .clone() + .or_else(|| request.customer_id.clone()), + )?; + } + let shipping_address = helpers::get_address_for_payment_request( db, request.shipping.as_ref(), @@ -114,20 +126,6 @@ impl GetTracker, api::PaymentsRequest> for Pa payment_intent.billing_address_id = billing_address.clone().map(|x| x.address_id); payment_intent.return_url = request.return_url.clone(); - if request.confirm.unwrap_or(false) { - helpers::validate_customer_id_mandatory_cases_storage( - &shipping_address, - &billing_address, - &payment_intent - .setup_future_usage - .or_else(|| request.setup_future_usage.map(ForeignInto::foreign_into)), - &payment_intent - .customer_id - .clone() - .or_else(|| request.customer_id.clone()), - )?; - } - let token = token.or_else(|| payment_attempt.payment_token.clone()); if request.confirm.unwrap_or(false) {