Skip to content

Commit e867b46

Browse files
committed
feat: add logic to render required_fields in response of pml list
1 parent 1e20b57 commit e867b46

File tree

2 files changed

+75
-16
lines changed

2 files changed

+75
-16
lines changed

crates/api_models/src/payments.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7657,7 +7657,7 @@ pub struct ResponsePaymentMethodTypesForPayments {
76577657
/// Required fields for the payment_method_type.
76587658
/// This is the union of all the required fields for the payment method type enabled in all the connectors.
76597659
#[schema(value_type = Option<RequiredFieldInfo>)]
7660-
pub required_fields: Option<Vec<payment_methods::RequiredFieldInfo>>,
7660+
pub required_fields: Vec<payment_methods::RequiredFieldInfo>,
76617661

76627662
/// surcharge details for this payment method type if exists
76637663
#[schema(value_type = Option<SurchargeDetailsResponse>)]

crates/router/src/core/payments/payment_methods.rs

Lines changed: 74 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ use common_utils::{ext_traits::OptionExt, id_type};
55
use error_stack::ResultExt;
66

77
use super::errors;
8-
use crate::{core::payment_methods, db::errors::StorageErrorExt, routes, types::domain};
8+
use crate::{
9+
configs::settings, core::payment_methods, db::errors::StorageErrorExt, routes, types::domain,
10+
};
911

1012
#[cfg(all(
1113
feature = "v2",
@@ -61,7 +63,7 @@ pub async fn list_payment_methods(
6163
let response =
6264
hyperswitch_domain_models::merchant_connector_account::FlattenedPaymentMethodsEnabled::from_payment_connectors_list(payment_connector_accounts)
6365
.perform_filtering()
64-
.get_required_fields(RequiredFieldsInput::new())
66+
.get_required_fields(RequiredFieldsInput::new(state.conf.required_fields.clone()))
6567
.perform_surcharge_calculation()
6668
.generate_response(customer_payment_methods);
6769

@@ -71,11 +73,41 @@ pub async fn list_payment_methods(
7173
}
7274

7375
/// Container for the inputs required for the required fields
74-
struct RequiredFieldsInput {}
76+
struct RequiredFieldsInput {
77+
required_fields_config: settings::RequiredFields,
78+
}
7579

7680
impl RequiredFieldsInput {
77-
fn new() -> Self {
78-
Self {}
81+
fn new(required_fields_config: settings::RequiredFields) -> Self {
82+
Self {
83+
required_fields_config,
84+
}
85+
}
86+
}
87+
88+
trait GetRequiredFields {
89+
fn get_required_fields(
90+
&self,
91+
payment_method_enabled: &hyperswitch_domain_models::merchant_connector_account::PaymentMethodsEnabledForConnector,
92+
) -> Option<&settings::RequiredFieldFinal>;
93+
}
94+
95+
impl GetRequiredFields for settings::RequiredFields {
96+
fn get_required_fields(
97+
&self,
98+
payment_method_enabled: &hyperswitch_domain_models::merchant_connector_account::PaymentMethodsEnabledForConnector,
99+
) -> Option<&settings::RequiredFieldFinal> {
100+
self.0
101+
.get(&payment_method_enabled.payment_method)
102+
.and_then(|required_fields_for_payment_method| {
103+
required_fields_for_payment_method.0.get(
104+
&payment_method_enabled
105+
.payment_methods_enabled
106+
.payment_method_subtype,
107+
)
108+
})
109+
.map(|connector_fields| &connector_fields.fields)
110+
.and_then(|connector_hashmap| connector_hashmap.get(&payment_method_enabled.connector))
79111
}
80112
}
81113

@@ -87,23 +119,50 @@ struct FilteredPaymentMethodsEnabled(
87119
impl FilteredPaymentMethodsEnabled {
88120
fn get_required_fields(
89121
self,
90-
_input: RequiredFieldsInput,
122+
input: RequiredFieldsInput,
91123
) -> RequiredFieldsForEnabledPaymentMethodTypes {
124+
let required_fields_config = input.required_fields_config;
125+
92126
let required_fields_info = self
93127
.0
94128
.into_iter()
95-
.map(
96-
|payment_methods_enabled| RequiredFieldsForEnabledPaymentMethod {
97-
required_field: None,
129+
.map(|payment_methods_enabled| {
130+
let required_fields =
131+
required_fields_config.get_required_fields(&payment_methods_enabled);
132+
133+
let required_fields = required_fields
134+
.map(|required_fields| {
135+
let common_required_fields = required_fields
136+
.common
137+
.iter()
138+
.flatten()
139+
.map(ToOwned::to_owned);
140+
141+
// Collect mandate required fields because this is for zero auth mandates only
142+
let mandate_required_fields = required_fields
143+
.mandate
144+
.iter()
145+
.flatten()
146+
.map(ToOwned::to_owned);
147+
148+
// Combine both common and mandate required fields
149+
common_required_fields
150+
.chain(mandate_required_fields)
151+
.collect::<Vec<_>>()
152+
})
153+
.unwrap_or_default();
154+
155+
RequiredFieldsForEnabledPaymentMethod {
156+
required_fields,
98157
payment_method_type: payment_methods_enabled.payment_method,
99158
payment_method_subtype: payment_methods_enabled
100159
.payment_methods_enabled
101160
.payment_method_subtype,
102161
payment_experience: payment_methods_enabled
103162
.payment_methods_enabled
104163
.payment_experience,
105-
},
106-
)
164+
}
165+
})
107166
.collect();
108167

109168
RequiredFieldsForEnabledPaymentMethodTypes(required_fields_info)
@@ -112,7 +171,7 @@ impl FilteredPaymentMethodsEnabled {
112171

113172
/// Element container to hold the filtered payment methods with required fields
114173
struct RequiredFieldsForEnabledPaymentMethod {
115-
required_field: Option<Vec<api_models::payment_methods::RequiredFieldInfo>>,
174+
required_fields: Vec<api_models::payment_methods::RequiredFieldInfo>,
116175
payment_method_subtype: common_enums::PaymentMethodType,
117176
payment_method_type: common_enums::PaymentMethod,
118177
payment_experience: Option<common_enums::PaymentExperience>,
@@ -123,7 +182,7 @@ struct RequiredFieldsForEnabledPaymentMethodTypes(Vec<RequiredFieldsForEnabledPa
123182

124183
/// Element Container to hold the filtered payment methods enabled with required fields and surcharge
125184
struct RequiredFieldsAndSurchargeForEnabledPaymentMethodType {
126-
required_field: Option<Vec<api_models::payment_methods::RequiredFieldInfo>>,
185+
required_fields: Vec<api_models::payment_methods::RequiredFieldInfo>,
127186
payment_method_subtype: common_enums::PaymentMethodType,
128187
payment_method_type: common_enums::PaymentMethod,
129188
payment_experience: Option<common_enums::PaymentExperience>,
@@ -150,7 +209,7 @@ impl RequiredFieldsAndSurchargeForEnabledPaymentMethodTypes {
150209
payment_method_type: payment_methods_enabled.payment_method_type,
151210
payment_method_subtype: payment_methods_enabled.payment_method_subtype,
152211
payment_experience: payment_methods_enabled.payment_experience,
153-
required_fields: payment_methods_enabled.required_field,
212+
required_fields: payment_methods_enabled.required_fields,
154213
surcharge_details: payment_methods_enabled.surcharge,
155214
extra_information: None,
156215
}
@@ -174,7 +233,7 @@ impl RequiredFieldsForEnabledPaymentMethodTypes {
174233
.map(
175234
|payment_methods_enabled| RequiredFieldsAndSurchargeForEnabledPaymentMethodType {
176235
payment_method_type: payment_methods_enabled.payment_method_type,
177-
required_field: payment_methods_enabled.required_field,
236+
required_fields: payment_methods_enabled.required_fields,
178237
payment_method_subtype: payment_methods_enabled.payment_method_subtype,
179238
payment_experience: payment_methods_enabled.payment_experience,
180239
surcharge: None,

0 commit comments

Comments
 (0)