@@ -5,7 +5,9 @@ use common_utils::{ext_traits::OptionExt, id_type};
5
5
use error_stack:: ResultExt ;
6
6
7
7
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
+ } ;
9
11
10
12
#[ cfg( all(
11
13
feature = "v2" ,
@@ -61,7 +63,7 @@ pub async fn list_payment_methods(
61
63
let response =
62
64
hyperswitch_domain_models:: merchant_connector_account:: FlattenedPaymentMethodsEnabled :: from_payment_connectors_list ( payment_connector_accounts)
63
65
. perform_filtering ( )
64
- . get_required_fields ( RequiredFieldsInput :: new ( ) )
66
+ . get_required_fields ( RequiredFieldsInput :: new ( state . conf . required_fields . clone ( ) ) )
65
67
. perform_surcharge_calculation ( )
66
68
. generate_response ( customer_payment_methods) ;
67
69
@@ -71,11 +73,41 @@ pub async fn list_payment_methods(
71
73
}
72
74
73
75
/// Container for the inputs required for the required fields
74
- struct RequiredFieldsInput { }
76
+ struct RequiredFieldsInput {
77
+ required_fields_config : settings:: RequiredFields ,
78
+ }
75
79
76
80
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 ) )
79
111
}
80
112
}
81
113
@@ -87,23 +119,50 @@ struct FilteredPaymentMethodsEnabled(
87
119
impl FilteredPaymentMethodsEnabled {
88
120
fn get_required_fields (
89
121
self ,
90
- _input : RequiredFieldsInput ,
122
+ input : RequiredFieldsInput ,
91
123
) -> RequiredFieldsForEnabledPaymentMethodTypes {
124
+ let required_fields_config = input. required_fields_config ;
125
+
92
126
let required_fields_info = self
93
127
. 0
94
128
. 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,
98
157
payment_method_type : payment_methods_enabled. payment_method ,
99
158
payment_method_subtype : payment_methods_enabled
100
159
. payment_methods_enabled
101
160
. payment_method_subtype ,
102
161
payment_experience : payment_methods_enabled
103
162
. payment_methods_enabled
104
163
. payment_experience ,
105
- } ,
106
- )
164
+ }
165
+ } )
107
166
. collect ( ) ;
108
167
109
168
RequiredFieldsForEnabledPaymentMethodTypes ( required_fields_info)
@@ -112,7 +171,7 @@ impl FilteredPaymentMethodsEnabled {
112
171
113
172
/// Element container to hold the filtered payment methods with required fields
114
173
struct RequiredFieldsForEnabledPaymentMethod {
115
- required_field : Option < Vec < api_models:: payment_methods:: RequiredFieldInfo > > ,
174
+ required_fields : Vec < api_models:: payment_methods:: RequiredFieldInfo > ,
116
175
payment_method_subtype : common_enums:: PaymentMethodType ,
117
176
payment_method_type : common_enums:: PaymentMethod ,
118
177
payment_experience : Option < common_enums:: PaymentExperience > ,
@@ -123,7 +182,7 @@ struct RequiredFieldsForEnabledPaymentMethodTypes(Vec<RequiredFieldsForEnabledPa
123
182
124
183
/// Element Container to hold the filtered payment methods enabled with required fields and surcharge
125
184
struct RequiredFieldsAndSurchargeForEnabledPaymentMethodType {
126
- required_field : Option < Vec < api_models:: payment_methods:: RequiredFieldInfo > > ,
185
+ required_fields : Vec < api_models:: payment_methods:: RequiredFieldInfo > ,
127
186
payment_method_subtype : common_enums:: PaymentMethodType ,
128
187
payment_method_type : common_enums:: PaymentMethod ,
129
188
payment_experience : Option < common_enums:: PaymentExperience > ,
@@ -150,7 +209,7 @@ impl RequiredFieldsAndSurchargeForEnabledPaymentMethodTypes {
150
209
payment_method_type : payment_methods_enabled. payment_method_type ,
151
210
payment_method_subtype : payment_methods_enabled. payment_method_subtype ,
152
211
payment_experience : payment_methods_enabled. payment_experience ,
153
- required_fields : payment_methods_enabled. required_field ,
212
+ required_fields : payment_methods_enabled. required_fields ,
154
213
surcharge_details : payment_methods_enabled. surcharge ,
155
214
extra_information : None ,
156
215
}
@@ -174,7 +233,7 @@ impl RequiredFieldsForEnabledPaymentMethodTypes {
174
233
. map (
175
234
|payment_methods_enabled| RequiredFieldsAndSurchargeForEnabledPaymentMethodType {
176
235
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 ,
178
237
payment_method_subtype : payment_methods_enabled. payment_method_subtype ,
179
238
payment_experience : payment_methods_enabled. payment_experience ,
180
239
surcharge : None ,
0 commit comments