Skip to content

Commit f9cea38

Browse files
feat(payments_v2): add logic to render required_fields in response of payment_method list (#8317)
Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
1 parent 7137725 commit f9cea38

File tree

3 files changed

+75
-22
lines changed

3 files changed

+75
-22
lines changed

api-reference/v2/openapi_spec_v2.json

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22358,7 +22358,8 @@
2235822358
"type": "object",
2235922359
"required": [
2236022360
"payment_method_type",
22361-
"payment_method_subtype"
22361+
"payment_method_subtype",
22362+
"required_fields"
2236222363
],
2236322364
"properties": {
2236422365
"payment_method_type": {
@@ -22376,12 +22377,7 @@
2237622377
"nullable": true
2237722378
},
2237822379
"required_fields": {
22379-
"allOf": [
22380-
{
22381-
"$ref": "#/components/schemas/RequiredFieldInfo"
22382-
}
22383-
],
22384-
"nullable": true
22380+
"$ref": "#/components/schemas/RequiredFieldInfo"
2238522381
},
2238622382
"surcharge_details": {
2238722383
"allOf": [

crates/api_models/src/payments.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7765,8 +7765,8 @@ pub struct ResponsePaymentMethodTypesForPayments {
77657765

77667766
/// Required fields for the payment_method_type.
77677767
/// This is the union of all the required fields for the payment method type enabled in all the connectors.
7768-
#[schema(value_type = Option<RequiredFieldInfo>)]
7769-
pub required_fields: Option<Vec<payment_methods::RequiredFieldInfo>>,
7768+
#[schema(value_type = RequiredFieldInfo)]
7769+
pub required_fields: Vec<payment_methods::RequiredFieldInfo>,
77707770

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

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

Lines changed: 70 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ pub async fn list_payment_methods(
8282
&payment_intent,
8383
).await?
8484
.merge_and_transform()
85-
.get_required_fields(RequiredFieldsInput::new())
85+
.get_required_fields(RequiredFieldsInput::new(state.conf.required_fields.clone()))
8686
.perform_surcharge_calculation()
8787
.populate_pm_subtype_specific_data(&state.conf.bank_config)
8888
.generate_response(customer_payment_methods);
@@ -93,11 +93,41 @@ pub async fn list_payment_methods(
9393
}
9494

9595
/// Container for the inputs required for the required fields
96-
struct RequiredFieldsInput {}
96+
struct RequiredFieldsInput {
97+
required_fields_config: settings::RequiredFields,
98+
}
9799

98100
impl RequiredFieldsInput {
99-
fn new() -> Self {
100-
Self {}
101+
fn new(required_fields_config: settings::RequiredFields) -> Self {
102+
Self {
103+
required_fields_config,
104+
}
105+
}
106+
}
107+
108+
trait GetRequiredFields {
109+
fn get_required_fields(
110+
&self,
111+
payment_method_enabled: &hyperswitch_domain_models::merchant_connector_account::PaymentMethodsEnabledForConnector,
112+
) -> Option<&settings::RequiredFieldFinal>;
113+
}
114+
115+
impl GetRequiredFields for settings::RequiredFields {
116+
fn get_required_fields(
117+
&self,
118+
payment_method_enabled: &hyperswitch_domain_models::merchant_connector_account::PaymentMethodsEnabledForConnector,
119+
) -> Option<&settings::RequiredFieldFinal> {
120+
self.0
121+
.get(&payment_method_enabled.payment_method)
122+
.and_then(|required_fields_for_payment_method| {
123+
required_fields_for_payment_method.0.get(
124+
&payment_method_enabled
125+
.payment_methods_enabled
126+
.payment_method_subtype,
127+
)
128+
})
129+
.map(|connector_fields| &connector_fields.fields)
130+
.and_then(|connector_hashmap| connector_hashmap.get(&payment_method_enabled.connector))
101131
}
102132
}
103133

@@ -170,20 +200,47 @@ struct MergedEnabledPaymentMethodTypes(Vec<MergedEnabledPaymentMethod>);
170200
impl MergedEnabledPaymentMethodTypes {
171201
fn get_required_fields(
172202
self,
173-
_input: RequiredFieldsInput,
203+
input: RequiredFieldsInput,
174204
) -> RequiredFieldsForEnabledPaymentMethodTypes {
205+
let required_fields_config = input.required_fields_config;
206+
175207
let required_fields_info = self
176208
.0
177209
.into_iter()
178-
.map(
179-
|payment_methods_enabled| RequiredFieldsForEnabledPaymentMethod {
180-
required_field: None,
210+
.map(|payment_methods_enabled| {
211+
let required_fields =
212+
required_fields_config.get_required_fields(&payment_methods_enabled);
213+
214+
let required_fields = required_fields
215+
.map(|required_fields| {
216+
let common_required_fields = required_fields
217+
.common
218+
.iter()
219+
.flatten()
220+
.map(ToOwned::to_owned);
221+
222+
// Collect mandate required fields because this is for zero auth mandates only
223+
let mandate_required_fields = required_fields
224+
.mandate
225+
.iter()
226+
.flatten()
227+
.map(ToOwned::to_owned);
228+
229+
// Combine both common and mandate required fields
230+
common_required_fields
231+
.chain(mandate_required_fields)
232+
.collect::<Vec<_>>()
233+
})
234+
.unwrap_or_default();
235+
236+
RequiredFieldsForEnabledPaymentMethod {
237+
required_fields,
181238
payment_method_type: payment_methods_enabled.payment_method_type,
182239
payment_method_subtype: payment_methods_enabled.payment_method_subtype,
183240
payment_experience: payment_methods_enabled.payment_experience,
184241
connectors: payment_methods_enabled.connectors,
185-
},
186-
)
242+
}
243+
})
187244
.collect();
188245

189246
RequiredFieldsForEnabledPaymentMethodTypes(required_fields_info)
@@ -192,7 +249,7 @@ impl MergedEnabledPaymentMethodTypes {
192249

193250
/// Element container to hold the filtered payment methods with required fields
194251
struct RequiredFieldsForEnabledPaymentMethod {
195-
required_field: Option<Vec<api_models::payment_methods::RequiredFieldInfo>>,
252+
required_fields: Vec<api_models::payment_methods::RequiredFieldInfo>,
196253
payment_method_subtype: common_enums::PaymentMethodType,
197254
payment_method_type: common_enums::PaymentMethod,
198255
payment_experience: Option<Vec<common_enums::PaymentExperience>>,
@@ -228,7 +285,7 @@ impl RequiredFieldsForEnabledPaymentMethodTypes {
228285

229286
/// Element Container to hold the filtered payment methods enabled with required fields and surcharge
230287
struct RequiredFieldsAndSurchargeForEnabledPaymentMethodType {
231-
required_field: Option<Vec<api_models::payment_methods::RequiredFieldInfo>>,
288+
required_fields: Vec<api_models::payment_methods::RequiredFieldInfo>,
232289
payment_method_subtype: common_enums::PaymentMethodType,
233290
payment_method_type: common_enums::PaymentMethod,
234291
payment_experience: Option<Vec<common_enums::PaymentExperience>>,
@@ -354,7 +411,7 @@ impl RequiredFieldsAndSurchargeWithExtraInfoForEnabledPaymentMethodTypes {
354411
payment_method_type: payment_methods_enabled.payment_method_type,
355412
payment_method_subtype: payment_methods_enabled.payment_method_subtype,
356413
payment_experience: payment_methods_enabled.payment_experience,
357-
required_fields: payment_methods_enabled.required_field,
414+
required_fields: payment_methods_enabled.required_fields,
358415
surcharge_details: payment_methods_enabled.surcharge,
359416
extra_information: payment_methods_enabled.pm_subtype_specific_data,
360417
}

0 commit comments

Comments
 (0)