fix(router): better positioning for mandatory customer id conditions (#364)

This commit is contained in:
ItsMeShashank
2023-01-13 01:20:19 +05:30
committed by GitHub
parent 5bb9e745d8
commit ba5c3efc86
4 changed files with 40 additions and 51 deletions

View File

@ -306,33 +306,19 @@ fn validate_new_mandate_request(req: api::MandateValidationFields) -> RouterResu
Ok(()) Ok(())
} }
pub fn validate_customer_id_mandatory_cases_api( pub fn validate_customer_id_mandatory_cases(
shipping: &Option<api::Address>, has_shipping: bool,
billing: &Option<api::Address>, has_billing: bool,
setup_future_usage: &Option<api_enums::FutureUsage>, has_setup_future_usage: bool,
customer_id: &Option<String>, customer_id: &Option<String>,
) -> RouterResult<()> { ) -> RouterResult<()> {
match (shipping, billing, setup_future_usage, customer_id) { match (
(Some(_), _, _, None) | (_, Some(_), _, None) | (_, _, Some(_), None) => { has_shipping,
Err(errors::ApiErrorResponse::PreconditionFailed { has_billing,
message: "customer_id is mandatory when shipping or billing \ has_setup_future_usage,
address is given or when setup_future_usage is given" customer_id,
.to_string(), ) {
}) (true, _, _, None) | (_, true, _, None) | (_, _, true, None) => {
.into_report()
}
_ => Ok(()),
}
}
pub fn validate_customer_id_mandatory_cases_storage(
shipping: &Option<storage::Address>,
billing: &Option<storage::Address>,
setup_future_usage: &Option<storage_enums::FutureUsage>,
customer_id: &Option<String>,
) -> RouterResult<()> {
match (shipping, billing, setup_future_usage, customer_id) {
(Some(_), _, _, None) | (_, Some(_), _, None) | (_, _, Some(_), None) => {
Err(errors::ApiErrorResponse::PreconditionFailed { Err(errors::ApiErrorResponse::PreconditionFailed {
message: "customer_id is mandatory when shipping or billing \ message: "customer_id is mandatory when shipping or billing \
address is given or when setup_future_usage is given" address is given or when setup_future_usage is given"

View File

@ -106,6 +106,16 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
currency = payment_attempt.currency.get_required_value("currency")?; currency = payment_attempt.currency.get_required_value("currency")?;
amount = payment_attempt.amount.into(); 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( let shipping_address = helpers::get_address_for_payment_request(
db, db,
request.shipping.as_ref(), request.shipping.as_ref(),
@ -123,18 +133,6 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
) )
.await?; .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 connector_response = db
.find_connector_response_by_payment_id_merchant_id_attempt_id( .find_connector_response_by_payment_id_merchant_id_attempt_id(
&payment_attempt.payment_id, &payment_attempt.payment_id,

View File

@ -378,6 +378,13 @@ impl<F: Send + Clone> ValidateRequest<F, api::PaymentsRequest> for PaymentCreate
&mandate_type, &mandate_type,
&request.payment_token, &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(( Ok((

View File

@ -93,6 +93,18 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
payment_intent.client_secret.as_ref(), 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( let shipping_address = helpers::get_address_for_payment_request(
db, db,
request.shipping.as_ref(), request.shipping.as_ref(),
@ -114,20 +126,6 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
payment_intent.billing_address_id = billing_address.clone().map(|x| x.address_id); payment_intent.billing_address_id = billing_address.clone().map(|x| x.address_id);
payment_intent.return_url = request.return_url.clone(); 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()); let token = token.or_else(|| payment_attempt.payment_token.clone());
if request.confirm.unwrap_or(false) { if request.confirm.unwrap_or(false) {