1
1
use api_models:: admin as admin_types;
2
+ use common_utils:: {
3
+ consts:: {
4
+ DEFAULT_BACKGROUND_COLOR , DEFAULT_MERCHANT_LOGO , DEFAULT_PRODUCT_IMG , DEFAULT_SDK_THEME ,
5
+ } ,
6
+ ext_traits:: ValueExt ,
7
+ } ;
2
8
use error_stack:: { IntoReport , ResultExt } ;
3
- use masking:: PeekInterface ;
9
+ use masking:: { PeekInterface , Secret } ;
4
10
5
11
use super :: errors:: { self , RouterResult , StorageErrorExt } ;
6
12
use crate :: {
@@ -76,12 +82,7 @@ pub async fn intiate_payment_link_flow(
76
82
} )
77
83
. transpose ( ) ?;
78
84
79
- let order_details = payment_intent
80
- . order_details
81
- . get_required_value ( "order_details" )
82
- . change_context ( errors:: ApiErrorResponse :: MissingRequiredField {
83
- field_name : "order_details" ,
84
- } ) ?;
85
+ let order_details = validate_order_details ( payment_intent. order_details ) ?;
85
86
86
87
let return_url = if let Some ( payment_create_return_url) = payment_intent. return_url {
87
88
payment_create_return_url
@@ -99,6 +100,9 @@ pub async fn intiate_payment_link_flow(
99
100
payment_intent. client_secret ,
100
101
) ?;
101
102
103
+ let ( default_sdk_theme, default_background_color) =
104
+ ( DEFAULT_SDK_THEME , DEFAULT_BACKGROUND_COLOR ) ;
105
+
102
106
let payment_details = api_models:: payments:: PaymentLinkDetails {
103
107
amount : payment_intent. amount ,
104
108
currency,
@@ -116,13 +120,25 @@ pub async fn intiate_payment_link_flow(
116
120
client_secret,
117
121
merchant_logo : payment_link_config
118
122
. clone ( )
119
- . map ( |pl_metadata| pl_metadata. merchant_logo . unwrap_or_default ( ) )
123
+ . map ( |pl_config| {
124
+ pl_config
125
+ . merchant_logo
126
+ . unwrap_or ( DEFAULT_MERCHANT_LOGO . to_string ( ) )
127
+ } )
120
128
. unwrap_or_default ( ) ,
121
129
max_items_visible_after_collapse : 3 ,
130
+ sdk_theme : payment_link_config. clone ( ) . and_then ( |pl_config| {
131
+ pl_config
132
+ . color_scheme
133
+ . map ( |color| color. sdk_theme . unwrap_or ( default_sdk_theme. to_string ( ) ) )
134
+ } ) ,
122
135
} ;
123
136
124
137
let js_script = get_js_script ( payment_details) ?;
125
- let css_script = get_color_scheme_css ( payment_link_config. clone ( ) ) ;
138
+ let css_script = get_color_scheme_css (
139
+ payment_link_config. clone ( ) ,
140
+ default_background_color. to_string ( ) ,
141
+ ) ;
126
142
let payment_link_data = services:: PaymentLinkFormData {
127
143
js_script,
128
144
sdk_url : state. conf . payment_link . sdk_url . clone ( ) ,
@@ -149,38 +165,21 @@ fn get_js_script(
149
165
150
166
fn get_color_scheme_css (
151
167
payment_link_config : Option < api_models:: admin:: PaymentLinkConfig > ,
168
+ default_primary_color : String ,
152
169
) -> String {
153
- let ( default_primary_color, default_accent_color, default_secondary_color) = (
154
- "#C6C7C8" . to_string ( ) ,
155
- "#6A8EF5" . to_string ( ) ,
156
- "#0C48F6" . to_string ( ) ,
157
- ) ;
158
-
159
- let ( primary_color, primary_accent_color, secondary_color) = payment_link_config
170
+ let background_primary_color = payment_link_config
160
171
. and_then ( |pl_config| {
161
172
pl_config. color_scheme . map ( |color| {
162
- (
163
- color. primary_color . unwrap_or ( default_primary_color. clone ( ) ) ,
164
- color
165
- . primary_accent_color
166
- . unwrap_or ( default_accent_color. clone ( ) ) ,
167
- color
168
- . secondary_color
169
- . unwrap_or ( default_secondary_color. clone ( ) ) ,
170
- )
173
+ color
174
+ . background_primary_color
175
+ . unwrap_or ( default_primary_color. clone ( ) )
171
176
} )
172
177
} )
173
- . unwrap_or ( (
174
- default_primary_color,
175
- default_accent_color,
176
- default_secondary_color,
177
- ) ) ;
178
+ . unwrap_or ( default_primary_color) ;
178
179
179
180
format ! (
180
181
":root {{
181
- --primary-color: {primary_color};
182
- --primary-accent-color: {primary_accent_color};
183
- --secondary-color: {secondary_color};
182
+ --primary-color: {background_primary_color};
184
183
}}"
185
184
)
186
185
}
@@ -203,3 +202,36 @@ fn validate_sdk_requirements(
203
202
} ) ?;
204
203
Ok ( ( pub_key, currency, client_secret) )
205
204
}
205
+
206
+ fn validate_order_details (
207
+ order_details : Option < Vec < Secret < serde_json:: Value > > > ,
208
+ ) -> Result <
209
+ Option < Vec < api_models:: payments:: OrderDetailsWithAmount > > ,
210
+ error_stack:: Report < errors:: ApiErrorResponse > ,
211
+ > {
212
+ let order_details = order_details
213
+ . map ( |order_details| {
214
+ order_details
215
+ . iter ( )
216
+ . map ( |data| {
217
+ data. to_owned ( )
218
+ . parse_value ( "OrderDetailsWithAmount" )
219
+ . change_context ( errors:: ApiErrorResponse :: InvalidDataValue {
220
+ field_name : "OrderDetailsWithAmount" ,
221
+ } )
222
+ . attach_printable ( "Unable to parse OrderDetailsWithAmount" )
223
+ } )
224
+ . collect :: < Result < Vec < api_models:: payments:: OrderDetailsWithAmount > , _ > > ( )
225
+ } )
226
+ . transpose ( ) ?;
227
+
228
+ let updated_order_details = order_details. map ( |mut order_details| {
229
+ for order in order_details. iter_mut ( ) {
230
+ if order. product_img_link . is_none ( ) {
231
+ order. product_img_link = Some ( DEFAULT_PRODUCT_IMG . to_string ( ) ) ;
232
+ }
233
+ }
234
+ order_details
235
+ } ) ;
236
+ Ok ( updated_order_details)
237
+ }
0 commit comments