refactor: [Noon] add new field max_amount to mandate request (#3481)

Co-authored-by: swangi-kumari <swangi.12015941@lpu.in>
Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
AkshayaFoiger
2024-02-07 14:48:51 +05:30
committed by GitHub
parent 3af6aaf28e
commit 926d084e44
2 changed files with 62 additions and 37 deletions

View File

@ -738,9 +738,25 @@ impl ForeignTryFrom<(Option<MandateData>, Option<String>)> for Option<payments::
metadata: None,
},
)),
StripeMandateType::MultiUse => Some(payments::MandateType::MultiUse(None)),
StripeMandateType::MultiUse => Some(payments::MandateType::MultiUse(Some(
payments::MandateAmountData {
amount: mandate.amount.unwrap_or_default(),
currency,
start_date: mandate.start_date,
end_date: mandate.end_date,
metadata: None,
},
))),
},
None => Some(api_models::payments::MandateType::MultiUse(None)),
None => Some(api_models::payments::MandateType::MultiUse(Some(
payments::MandateAmountData {
amount: mandate.amount.unwrap_or_default(),
currency,
start_date: mandate.start_date,
end_date: mandate.end_date,
metadata: None,
},
))),
},
customer_acceptance: Some(payments::CustomerAcceptance {
acceptance_type: payments::AcceptanceType::Online,

View File

@ -1,5 +1,5 @@
use common_utils::pii;
use error_stack::ResultExt;
use error_stack::{IntoReport, ResultExt};
use masking::{PeekInterface, Secret};
use serde::{Deserialize, Serialize};
@ -8,7 +8,7 @@ use crate::{
self as conn_utils, CardData, PaymentsAuthorizeRequestData, RevokeMandateRequestData,
RouterData, WalletData,
},
core::errors,
core::{errors, mandate::MandateBehaviour},
services,
types::{self, api, storage::enums, transformers::ForeignFrom, ErrorResponse},
utils,
@ -37,7 +37,7 @@ pub struct NoonSubscriptionData {
subscription_type: NoonSubscriptionType,
//Short description about the subscription.
name: String,
max_amount: Option<String>,
max_amount: String,
}
#[derive(Debug, Serialize)]
@ -131,7 +131,7 @@ pub struct NoonSubscription {
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct NoonCard {
name_on_card: Secret<String>,
name_on_card: Option<Secret<String>>,
number_plain: cards::CardNumber,
expiry_month: Secret<String>,
expiry_year: Secret<String>,
@ -198,7 +198,7 @@ pub struct NoonPayPal {
}
#[derive(Debug, Serialize)]
#[serde(tag = "type", content = "data")]
#[serde(tag = "type", content = "data", rename_all = "UPPERCASE")]
pub enum NoonPaymentData {
Card(NoonCard),
Subscription(NoonSubscription),
@ -241,10 +241,7 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for NoonPaymentsRequest {
_ => (
match item.request.payment_method_data.clone() {
api::PaymentMethodData::Card(req_card) => Ok(NoonPaymentData::Card(NoonCard {
name_on_card: req_card
.card_holder_name
.clone()
.unwrap_or(Secret::new("".to_string())),
name_on_card: req_card.card_holder_name.clone(),
number_plain: req_card.card_number.clone(),
expiry_month: req_card.card_exp_month.clone(),
expiry_year: req_card.get_expiry_year_4_digit(),
@ -335,7 +332,11 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for NoonPaymentsRequest {
}
}?,
Some(item.request.currency),
item.request.order_category.clone(),
Some(item.request.order_category.clone().ok_or(
errors::ConnectorError::MissingRequiredField {
field_name: "order_category",
},
)?),
),
};
@ -369,32 +370,40 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for NoonPaymentsRequest {
},
});
let (subscription, tokenize_c_c) =
match item.request.setup_future_usage.is_some().then_some((
NoonSubscriptionData {
subscription_type: NoonSubscriptionType::Unscheduled,
name: name.clone(),
max_amount: item
.request
.setup_mandate_details
.clone()
.and_then(|mandate_details| match mandate_details.mandate_type {
Some(data_models::mandates::MandateDataType::SingleUse(mandate))
| Some(data_models::mandates::MandateDataType::MultiUse(Some(
mandate,
))) => Some(
conn_utils::to_currency_base_unit(mandate.amount, mandate.currency)
.ok(),
),
_ => None,
let subscription: Option<NoonSubscriptionData> = item
.request
.get_setup_mandate_details()
.map(|mandate_data| {
let max_amount = match &mandate_data.mandate_type {
Some(data_models::mandates::MandateDataType::SingleUse(mandate))
| Some(data_models::mandates::MandateDataType::MultiUse(Some(mandate))) => {
conn_utils::to_currency_base_unit(mandate.amount, mandate.currency)
}
Some(data_models::mandates::MandateDataType::MultiUse(None)) => {
Err(errors::ConnectorError::MissingRequiredField {
field_name:
"setup_future_usage.mandate_data.mandate_type.multi_use.amount",
})
.flatten(),
},
true,
)) {
Some((a, b)) => (Some(a), Some(b)),
None => (None, None),
};
.into_report()
}
None => Err(errors::ConnectorError::MissingRequiredField {
field_name: "setup_future_usage.mandate_data.mandate_type",
})
.into_report(),
}?;
Ok::<NoonSubscriptionData, error_stack::Report<errors::ConnectorError>>(
NoonSubscriptionData {
subscription_type: NoonSubscriptionType::Unscheduled,
name: name.clone(),
max_amount,
},
)
})
.transpose()?;
let tokenize_c_c = subscription.is_some().then_some(true);
let order = NoonOrder {
amount: conn_utils::to_currency_base_unit(item.request.amount, item.request.currency)?,
currency,