@@ -82,7 +82,7 @@ pub async fn list_payment_methods(
82
82
& payment_intent,
83
83
) . await ?
84
84
. merge_and_transform ( )
85
- . get_required_fields ( RequiredFieldsInput :: new ( ) )
85
+ . get_required_fields ( RequiredFieldsInput :: new ( state . conf . required_fields . clone ( ) ) )
86
86
. perform_surcharge_calculation ( )
87
87
. populate_pm_subtype_specific_data ( & state. conf . bank_config )
88
88
. generate_response ( customer_payment_methods) ;
@@ -93,11 +93,41 @@ pub async fn list_payment_methods(
93
93
}
94
94
95
95
/// Container for the inputs required for the required fields
96
- struct RequiredFieldsInput { }
96
+ struct RequiredFieldsInput {
97
+ required_fields_config : settings:: RequiredFields ,
98
+ }
97
99
98
100
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 ) )
101
131
}
102
132
}
103
133
@@ -170,20 +200,47 @@ struct MergedEnabledPaymentMethodTypes(Vec<MergedEnabledPaymentMethod>);
170
200
impl MergedEnabledPaymentMethodTypes {
171
201
fn get_required_fields (
172
202
self ,
173
- _input : RequiredFieldsInput ,
203
+ input : RequiredFieldsInput ,
174
204
) -> RequiredFieldsForEnabledPaymentMethodTypes {
205
+ let required_fields_config = input. required_fields_config ;
206
+
175
207
let required_fields_info = self
176
208
. 0
177
209
. 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,
181
238
payment_method_type : payment_methods_enabled. payment_method_type ,
182
239
payment_method_subtype : payment_methods_enabled. payment_method_subtype ,
183
240
payment_experience : payment_methods_enabled. payment_experience ,
184
241
connectors : payment_methods_enabled. connectors ,
185
- } ,
186
- )
242
+ }
243
+ } )
187
244
. collect ( ) ;
188
245
189
246
RequiredFieldsForEnabledPaymentMethodTypes ( required_fields_info)
@@ -192,7 +249,7 @@ impl MergedEnabledPaymentMethodTypes {
192
249
193
250
/// Element container to hold the filtered payment methods with required fields
194
251
struct RequiredFieldsForEnabledPaymentMethod {
195
- required_field : Option < Vec < api_models:: payment_methods:: RequiredFieldInfo > > ,
252
+ required_fields : Vec < api_models:: payment_methods:: RequiredFieldInfo > ,
196
253
payment_method_subtype : common_enums:: PaymentMethodType ,
197
254
payment_method_type : common_enums:: PaymentMethod ,
198
255
payment_experience : Option < Vec < common_enums:: PaymentExperience > > ,
@@ -228,7 +285,7 @@ impl RequiredFieldsForEnabledPaymentMethodTypes {
228
285
229
286
/// Element Container to hold the filtered payment methods enabled with required fields and surcharge
230
287
struct RequiredFieldsAndSurchargeForEnabledPaymentMethodType {
231
- required_field : Option < Vec < api_models:: payment_methods:: RequiredFieldInfo > > ,
288
+ required_fields : Vec < api_models:: payment_methods:: RequiredFieldInfo > ,
232
289
payment_method_subtype : common_enums:: PaymentMethodType ,
233
290
payment_method_type : common_enums:: PaymentMethod ,
234
291
payment_experience : Option < Vec < common_enums:: PaymentExperience > > ,
@@ -354,7 +411,7 @@ impl RequiredFieldsAndSurchargeWithExtraInfoForEnabledPaymentMethodTypes {
354
411
payment_method_type : payment_methods_enabled. payment_method_type ,
355
412
payment_method_subtype : payment_methods_enabled. payment_method_subtype ,
356
413
payment_experience : payment_methods_enabled. payment_experience ,
357
- required_fields : payment_methods_enabled. required_field ,
414
+ required_fields : payment_methods_enabled. required_fields ,
358
415
surcharge_details : payment_methods_enabled. surcharge ,
359
416
extra_information : payment_methods_enabled. pm_subtype_specific_data ,
360
417
}
0 commit comments