mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-30 17:47:54 +08:00
feat: list payment_methods with the required fields in each method (#1310)
Co-authored-by: Sangamesh Kulkarni <59434228+Sangamesh26@users.noreply.github.com> Co-authored-by: Prasunna Soppa <prasunna.soppa@juspay.in>
This commit is contained in:
@ -1,3 +1,9 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
use api_models::{enums, payment_methods::RequiredFieldInfo};
|
||||
|
||||
use super::settings::{ConnectorFields, PaymentMethodType};
|
||||
|
||||
impl Default for super::settings::Server {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
@ -137,6 +143,811 @@ impl Default for super::settings::DrainerSettings {
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for super::settings::RequiredFields {
|
||||
fn default() -> Self {
|
||||
Self(HashMap::from([
|
||||
(
|
||||
enums::PaymentMethod::Card,
|
||||
PaymentMethodType(HashMap::from([(
|
||||
enums::PaymentMethodType::Debit,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Aci,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Bluesnap,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Bambora,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Cybersource,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.phone.number".to_string(),
|
||||
display_name: "phone_number".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.phone.country_code".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.line1".to_string(),
|
||||
display_name: "line1".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.city".to_string(),
|
||||
display_name: "city".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.state".to_string(),
|
||||
display_name: "state".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.zip".to_string(),
|
||||
display_name: "zip".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Dlocal,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Forte,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Globalpay,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Iatapay,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Multisafepay,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.line1".to_string(),
|
||||
display_name: "line1".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.line2".to_string(),
|
||||
display_name: "line2".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.city".to_string(),
|
||||
display_name: "city".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.zip".to_string(),
|
||||
display_name: "zip".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Noon,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Opennode,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "description".to_string(),
|
||||
display_name: "description".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Payu,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "description".to_string(),
|
||||
display_name: "description".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Rapyd,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Shift4,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Trustpay,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.line1".to_string(),
|
||||
display_name: "line1".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.city".to_string(),
|
||||
display_name: "city".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.zip".to_string(),
|
||||
display_name: "zip".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "browser_info".to_string(),
|
||||
display_name: "browser_info".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Worldline,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "card.card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Zen,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "browser_info".to_string(),
|
||||
display_name: "browser_info".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "description".to_string(),
|
||||
display_name: "description".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "metadata.order_details".to_string(),
|
||||
display_name: "order_details".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
]),
|
||||
},
|
||||
)])),
|
||||
),
|
||||
(
|
||||
enums::PaymentMethod::BankRedirect,
|
||||
PaymentMethodType(HashMap::from([
|
||||
(
|
||||
enums::PaymentMethodType::Ach,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Stripe,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "currency".to_string(),
|
||||
display_name: "currency".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Adyen,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "card_holder_name".to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Przelewy24,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([(
|
||||
enums::Connector::Stripe,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "bank_name".to_string(),
|
||||
display_name: "bank_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
)]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::BancontactCard,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Stripe,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "bancontact_card.billing_name".to_string(),
|
||||
display_name: "billing_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Adyen,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "bancontact_card.card_number"
|
||||
.to_string(),
|
||||
display_name: "card_number".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "bancontact_card.card_exp_month"
|
||||
.to_string(),
|
||||
display_name: "card_exp_month".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "bancontact_card.card_exp_year"
|
||||
.to_string(),
|
||||
display_name: "card_exp_year".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "bancontact_card.card_holder_name"
|
||||
.to_string(),
|
||||
display_name: "card_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Sepa,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([(
|
||||
enums::Connector::Adyen,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "bank_account_holder_name".to_string(),
|
||||
display_name: "bank_account_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
)]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Bacs,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([(
|
||||
enums::Connector::Adyen,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "bank_account_holder_name".to_string(),
|
||||
display_name: "bank_account_holder_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
)]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Giropay,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Worldline,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "giropay.billing_details.billing_name"
|
||||
.to_string(),
|
||||
display_name: "billing_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Nuvei,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
),
|
||||
]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Ideal,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Worldline,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "ideal.bank_name".to_string(),
|
||||
display_name: "bank_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Nuvei,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "ideal.bank_name".to_string(),
|
||||
display_name: "bank_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name"
|
||||
.to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
),
|
||||
]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Sofort,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([(
|
||||
enums::Connector::Nuvei,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
)]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Eps,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([(
|
||||
enums::Connector::Nuvei,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
)]),
|
||||
},
|
||||
),
|
||||
])),
|
||||
),
|
||||
(
|
||||
enums::PaymentMethod::Wallet,
|
||||
PaymentMethodType(HashMap::from([
|
||||
(
|
||||
enums::PaymentMethodType::ApplePay,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Bluesnap,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "billing_address".to_string(),
|
||||
display_name: "billing_address".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
(
|
||||
enums::Connector::Zen,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "metadata.order_details".to_string(),
|
||||
display_name: "order_details".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
),
|
||||
]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Paypal,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Mollie,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing_address".to_string(),
|
||||
display_name: "billing_address".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping_address".to_string(),
|
||||
display_name: "shipping_address".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Nuvei,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
),
|
||||
]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::GooglePay,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([(
|
||||
enums::Connector::Zen,
|
||||
vec![RequiredFieldInfo {
|
||||
required_field: "metadata.order_details".to_string(),
|
||||
display_name: "order_details".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
}],
|
||||
)]),
|
||||
},
|
||||
),
|
||||
])),
|
||||
),
|
||||
(
|
||||
enums::PaymentMethod::PayLater,
|
||||
PaymentMethodType(HashMap::from([
|
||||
(
|
||||
enums::PaymentMethodType::AfterpayClearpay,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([
|
||||
(
|
||||
enums::Connector::Stripe,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.first_name"
|
||||
.to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.line1".to_string(),
|
||||
display_name: "line1".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.zip".to_string(),
|
||||
display_name: "zip".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Adyen,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.first_name"
|
||||
.to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.line1".to_string(),
|
||||
display_name: "line1".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "shipping.address.zip".to_string(),
|
||||
display_name: "zip".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
],
|
||||
),
|
||||
(
|
||||
enums::Connector::Nuvei,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name"
|
||||
.to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
),
|
||||
]),
|
||||
},
|
||||
),
|
||||
(
|
||||
enums::PaymentMethodType::Klarna,
|
||||
ConnectorFields {
|
||||
fields: HashMap::from([(
|
||||
enums::Connector::Nuvei,
|
||||
vec![
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.first_name".to_string(),
|
||||
display_name: "first_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.last_name".to_string(),
|
||||
display_name: "last_name".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "email".to_string(),
|
||||
display_name: "email".to_string(),
|
||||
field_type: enums::FieldType::Text,
|
||||
},
|
||||
RequiredFieldInfo {
|
||||
required_field: "billing.address.country".to_string(),
|
||||
display_name: "country".to_string(),
|
||||
field_type: enums::FieldType::DropDown {
|
||||
options: vec!["US".to_string(), "IN".to_string()],
|
||||
},
|
||||
},
|
||||
],
|
||||
)]),
|
||||
},
|
||||
),
|
||||
])),
|
||||
),
|
||||
]))
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(clippy::derivable_impls)]
|
||||
impl Default for super::settings::ApiKeys {
|
||||
fn default() -> Self {
|
||||
|
||||
@ -4,7 +4,7 @@ use std::{
|
||||
str::FromStr,
|
||||
};
|
||||
|
||||
use api_models::enums;
|
||||
use api_models::{enums, payment_methods::RequiredFieldInfo};
|
||||
use common_utils::ext_traits::ConfigExt;
|
||||
use config::{Environment, File};
|
||||
#[cfg(feature = "email")]
|
||||
@ -83,6 +83,7 @@ pub struct Settings {
|
||||
pub dummy_connector: DummyConnector,
|
||||
#[cfg(feature = "email")]
|
||||
pub email: EmailSettings,
|
||||
pub required_fields: RequiredFields,
|
||||
pub delayed_session_response: DelayedSessionConfig,
|
||||
}
|
||||
|
||||
@ -223,6 +224,17 @@ pub struct NotAvailableFlows {
|
||||
pub capture_method: Option<enums::CaptureMethod>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
pub struct RequiredFields(pub HashMap<enums::PaymentMethod, PaymentMethodType>);
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
pub struct PaymentMethodType(pub HashMap<enums::PaymentMethodType, ConnectorFields>);
|
||||
|
||||
#[derive(Debug, Deserialize, Clone)]
|
||||
pub struct ConnectorFields {
|
||||
pub fields: HashMap<enums::Connector, Vec<RequiredFieldInfo>>,
|
||||
}
|
||||
|
||||
fn string_set_deser<'a, D>(
|
||||
deserializer: D,
|
||||
) -> Result<Option<HashSet<api_models::enums::CountryAlpha2>>, D::Error>
|
||||
|
||||
@ -1,10 +1,13 @@
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::{
|
||||
collections::{HashMap, HashSet},
|
||||
str::FromStr,
|
||||
};
|
||||
|
||||
use api_models::{
|
||||
admin::{self, PaymentMethodsEnabled},
|
||||
enums::{self as api_enums},
|
||||
payment_methods::{
|
||||
CardNetworkTypes, PaymentExperienceTypes, RequestPaymentMethodTypes,
|
||||
CardNetworkTypes, PaymentExperienceTypes, RequestPaymentMethodTypes, RequiredFieldInfo,
|
||||
ResponsePaymentMethodIntermediate, ResponsePaymentMethodTypes,
|
||||
ResponsePaymentMethodsEnabled,
|
||||
},
|
||||
@ -860,11 +863,56 @@ pub async fn list_payment_methods(
|
||||
let mut bank_transfer_consolidated_hm =
|
||||
HashMap::<api_enums::PaymentMethodType, Vec<String>>::new();
|
||||
|
||||
let mut required_fields_hm = HashMap::<
|
||||
api_enums::PaymentMethod,
|
||||
HashMap<api_enums::PaymentMethodType, HashSet<RequiredFieldInfo>>,
|
||||
>::new();
|
||||
|
||||
for element in response.clone() {
|
||||
let payment_method = element.payment_method;
|
||||
let payment_method_type = element.payment_method_type;
|
||||
let connector = element.connector.clone();
|
||||
|
||||
let connector_variant = api_enums::Connector::from_str(connector.as_str())
|
||||
.into_report()
|
||||
.change_context(errors::ConnectorError::InvalidConnectorName)
|
||||
.change_context(errors::ApiErrorResponse::InvalidDataValue {
|
||||
field_name: "connector",
|
||||
})
|
||||
.attach_printable_lazy(|| format!("unable to parse connector name {connector:?}"))?;
|
||||
state.conf.required_fields.0.get(&payment_method).map(
|
||||
|required_fields_hm_for_each_payment_method_type| {
|
||||
required_fields_hm_for_each_payment_method_type
|
||||
.0
|
||||
.get(&payment_method_type)
|
||||
.map(|required_fields_hm_for_each_connector| {
|
||||
required_fields_hm
|
||||
.entry(payment_method)
|
||||
.or_insert(HashMap::new());
|
||||
required_fields_hm_for_each_connector
|
||||
.fields
|
||||
.get(&connector_variant)
|
||||
.map(|required_fields_vec| {
|
||||
// If payment_method_type already exist in required_fields_hm, extend the required_fields hs to existing hs.
|
||||
let required_fields_hs =
|
||||
HashSet::from_iter(required_fields_vec.iter().cloned());
|
||||
|
||||
let existing_req_fields_hs = required_fields_hm
|
||||
.get_mut(&payment_method)
|
||||
.and_then(|inner_hm| inner_hm.get_mut(&payment_method_type));
|
||||
|
||||
if let Some(inner_hs) = existing_req_fields_hs {
|
||||
inner_hs.extend(required_fields_hs);
|
||||
} else {
|
||||
required_fields_hm.get_mut(&payment_method).map(|inner_hm| {
|
||||
inner_hm.insert(payment_method_type, required_fields_hs)
|
||||
});
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
);
|
||||
|
||||
if let Some(payment_experience) = element.payment_experience {
|
||||
if let Some(payment_method_hm) =
|
||||
payment_experiences_consolidated_hm.get_mut(&payment_method)
|
||||
@ -993,6 +1041,11 @@ pub async fn list_payment_methods(
|
||||
bank_names: None,
|
||||
bank_debits: None,
|
||||
bank_transfers: None,
|
||||
// Required fields for PayLater payment method
|
||||
required_fields: required_fields_hm
|
||||
.get(key.0)
|
||||
.and_then(|inner_hm| inner_hm.get(payment_method_types_hm.0))
|
||||
.cloned(),
|
||||
})
|
||||
}
|
||||
|
||||
@ -1020,6 +1073,11 @@ pub async fn list_payment_methods(
|
||||
bank_names: None,
|
||||
bank_debits: None,
|
||||
bank_transfers: None,
|
||||
// Required fields for Card payment method
|
||||
required_fields: required_fields_hm
|
||||
.get(key.0)
|
||||
.and_then(|inner_hm| inner_hm.get(payment_method_types_hm.0))
|
||||
.cloned(),
|
||||
})
|
||||
}
|
||||
|
||||
@ -1043,6 +1101,11 @@ pub async fn list_payment_methods(
|
||||
card_networks: None,
|
||||
bank_debits: None,
|
||||
bank_transfers: None,
|
||||
// Required fields for BankRedirect payment method
|
||||
required_fields: required_fields_hm
|
||||
.get(&api_enums::PaymentMethod::BankRedirect)
|
||||
.and_then(|inner_hm| inner_hm.get(key.0))
|
||||
.cloned(),
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -1069,6 +1132,11 @@ pub async fn list_payment_methods(
|
||||
eligible_connectors: connectors.clone(),
|
||||
}),
|
||||
bank_transfers: None,
|
||||
// Required fields for BankDebit payment method
|
||||
required_fields: required_fields_hm
|
||||
.get(&api_enums::PaymentMethod::BankDebit)
|
||||
.and_then(|inner_hm| inner_hm.get(key.0))
|
||||
.cloned(),
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -1095,6 +1163,11 @@ pub async fn list_payment_methods(
|
||||
bank_transfers: Some(api_models::payment_methods::BankTransferTypes {
|
||||
eligible_connectors: connectors,
|
||||
}),
|
||||
// Required fields for BankTransfer payment method
|
||||
required_fields: required_fields_hm
|
||||
.get(&api_enums::PaymentMethod::BankTransfer)
|
||||
.and_then(|inner_hm| inner_hm.get(key.0))
|
||||
.cloned(),
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@ -150,6 +150,7 @@ Never share your secret api keys. Keep them guarded and secure.
|
||||
api_models::enums::DisputeStage,
|
||||
api_models::enums::DisputeStatus,
|
||||
api_models::enums::CountryAlpha2,
|
||||
api_models::enums::FieldType,
|
||||
api_models::enums::FrmAction,
|
||||
api_models::enums::FrmPreferredFlowTypes,
|
||||
api_models::enums::RetryAction,
|
||||
@ -249,6 +250,7 @@ Never share your secret api keys. Keep them guarded and secure.
|
||||
api_models::payments::SepaBankTransferInstructions,
|
||||
api_models::payments::BacsBankTransferInstructions,
|
||||
api_models::payments::RedirectResponse,
|
||||
api_models::payment_methods::RequiredFieldInfo,
|
||||
api_models::refunds::RefundListRequest,
|
||||
api_models::refunds::RefundListResponse,
|
||||
api_models::refunds::TimeRange,
|
||||
|
||||
Reference in New Issue
Block a user