Skip to content

Commit 9b99db5

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 08a1f40 commit 9b99db5

File tree

3 files changed

+79
-24
lines changed

3 files changed

+79
-24
lines changed

api-reference/v2/openapi_spec_v2.json

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22286,7 +22286,8 @@
2228622286
"type": "object",
2228722287
"required": [
2228822288
"payment_method_type",
22289-
"payment_method_subtype"
22289+
"payment_method_subtype",
22290+
"required_fields"
2229022291
],
2229122292
"properties": {
2229222293
"payment_method_type": {
@@ -22304,12 +22305,7 @@
2230422305
"nullable": true
2230522306
},
2230622307
"required_fields": {
22307-
"allOf": [
22308-
{
22309-
"$ref": "#/components/schemas/RequiredFieldInfo"
22310-
}
22311-
],
22312-
"nullable": true
22308+
"$ref": "#/components/schemas/RequiredFieldInfo"
2231322309
},
2231422310
"surcharge_details": {
2231522311
"allOf": [

crates/api_models/src/payments.rs

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

77217721
/// Required fields for the payment_method_type.
77227722
/// This is the union of all the required fields for the payment method type enabled in all the connectors.
7723-
#[schema(value_type = Option<RequiredFieldInfo>)]
7724-
pub required_fields: Option<Vec<payment_methods::RequiredFieldInfo>>,
7723+
#[schema(value_type = RequiredFieldInfo)]
7724+
pub required_fields: Vec<payment_methods::RequiredFieldInfo>,
77257725

77267726
/// surcharge details for this payment method type if exists
77277727
#[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(feature = "v2")]
1113
pub async fn list_payment_methods(
@@ -57,7 +59,7 @@ pub async fn list_payment_methods(
5759
let response =
5860
hyperswitch_domain_models::merchant_connector_account::FlattenedPaymentMethodsEnabled::from_payment_connectors_list(payment_connector_accounts)
5961
.perform_filtering()
60-
.get_required_fields(RequiredFieldsInput::new())
62+
.get_required_fields(RequiredFieldsInput::new(state.conf.required_fields.clone()))
6163
.perform_surcharge_calculation()
6264
.generate_response(customer_payment_methods);
6365

@@ -67,11 +69,41 @@ pub async fn list_payment_methods(
6769
}
6870

6971
/// Container for the inputs required for the required fields
70-
struct RequiredFieldsInput {}
72+
struct RequiredFieldsInput {
73+
required_fields_config: settings::RequiredFields,
74+
}
7175

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

@@ -83,23 +115,50 @@ struct FilteredPaymentMethodsEnabled(
83115
impl FilteredPaymentMethodsEnabled {
84116
fn get_required_fields(
85117
self,
86-
_input: RequiredFieldsInput,
118+
input: RequiredFieldsInput,
87119
) -> RequiredFieldsForEnabledPaymentMethodTypes {
120+
let required_fields_config = input.required_fields_config;
121+
88122
let required_fields_info = self
89123
.0
90124
.into_iter()
91-
.map(
92-
|payment_methods_enabled| RequiredFieldsForEnabledPaymentMethod {
93-
required_field: None,
125+
.map(|payment_methods_enabled| {
126+
let required_fields =
127+
required_fields_config.get_required_fields(&payment_methods_enabled);
128+
129+
let required_fields = required_fields
130+
.map(|required_fields| {
131+
let common_required_fields = required_fields
132+
.common
133+
.iter()
134+
.flatten()
135+
.map(ToOwned::to_owned);
136+
137+
// Collect mandate required fields because this is for zero auth mandates only
138+
let mandate_required_fields = required_fields
139+
.mandate
140+
.iter()
141+
.flatten()
142+
.map(ToOwned::to_owned);
143+
144+
// Combine both common and mandate required fields
145+
common_required_fields
146+
.chain(mandate_required_fields)
147+
.collect::<Vec<_>>()
148+
})
149+
.unwrap_or_default();
150+
151+
RequiredFieldsForEnabledPaymentMethod {
152+
required_fields,
94153
payment_method_type: payment_methods_enabled.payment_method,
95154
payment_method_subtype: payment_methods_enabled
96155
.payment_methods_enabled
97156
.payment_method_subtype,
98157
payment_experience: payment_methods_enabled
99158
.payment_methods_enabled
100159
.payment_experience,
101-
},
102-
)
160+
}
161+
})
103162
.collect();
104163

105164
RequiredFieldsForEnabledPaymentMethodTypes(required_fields_info)
@@ -108,7 +167,7 @@ impl FilteredPaymentMethodsEnabled {
108167

109168
/// Element container to hold the filtered payment methods with required fields
110169
struct RequiredFieldsForEnabledPaymentMethod {
111-
required_field: Option<Vec<api_models::payment_methods::RequiredFieldInfo>>,
170+
required_fields: Vec<api_models::payment_methods::RequiredFieldInfo>,
112171
payment_method_subtype: common_enums::PaymentMethodType,
113172
payment_method_type: common_enums::PaymentMethod,
114173
payment_experience: Option<common_enums::PaymentExperience>,
@@ -119,7 +178,7 @@ struct RequiredFieldsForEnabledPaymentMethodTypes(Vec<RequiredFieldsForEnabledPa
119178

120179
/// Element Container to hold the filtered payment methods enabled with required fields and surcharge
121180
struct RequiredFieldsAndSurchargeForEnabledPaymentMethodType {
122-
required_field: Option<Vec<api_models::payment_methods::RequiredFieldInfo>>,
181+
required_fields: Vec<api_models::payment_methods::RequiredFieldInfo>,
123182
payment_method_subtype: common_enums::PaymentMethodType,
124183
payment_method_type: common_enums::PaymentMethod,
125184
payment_experience: Option<common_enums::PaymentExperience>,
@@ -146,7 +205,7 @@ impl RequiredFieldsAndSurchargeForEnabledPaymentMethodTypes {
146205
payment_method_type: payment_methods_enabled.payment_method_type,
147206
payment_method_subtype: payment_methods_enabled.payment_method_subtype,
148207
payment_experience: payment_methods_enabled.payment_experience,
149-
required_fields: payment_methods_enabled.required_field,
208+
required_fields: payment_methods_enabled.required_fields,
150209
surcharge_details: payment_methods_enabled.surcharge,
151210
extra_information: None,
152211
}
@@ -170,7 +229,7 @@ impl RequiredFieldsForEnabledPaymentMethodTypes {
170229
.map(
171230
|payment_methods_enabled| RequiredFieldsAndSurchargeForEnabledPaymentMethodType {
172231
payment_method_type: payment_methods_enabled.payment_method_type,
173-
required_field: payment_methods_enabled.required_field,
232+
required_fields: payment_methods_enabled.required_fields,
174233
payment_method_subtype: payment_methods_enabled.payment_method_subtype,
175234
payment_experience: payment_methods_enabled.payment_experience,
176235
surcharge: None,

0 commit comments

Comments
 (0)