@@ -5,7 +5,7 @@ use common_utils::{ext_traits::ValueExt, pii::Email, types::MinorUnit};
5
5
use error_stack:: ResultExt ;
6
6
use hyperswitch_domain_models:: {
7
7
payment_method_data:: { BankDebitData , PaymentMethodData } ,
8
- router_data:: { AccessToken , ConnectorAuthType , RouterData } ,
8
+ router_data:: { AccessToken , ConnectorAuthType , ErrorResponse , RouterData } ,
9
9
router_flow_types:: {
10
10
payments:: { Authorize , Capture , CompleteAuthorize , PSync } ,
11
11
refunds:: { Execute , RSync } ,
@@ -263,6 +263,21 @@ pub struct DeutschebankMandatePostResponse {
263
263
state : Option < DeutschebankSEPAMandateStatus > ,
264
264
}
265
265
266
+ fn get_error_response ( error_code : String , error_reason : String , status_code : u16 ) -> ErrorResponse {
267
+ ErrorResponse {
268
+ code : error_code. to_string ( ) ,
269
+ message : error_reason. clone ( ) ,
270
+ reason : Some ( error_reason) ,
271
+ status_code,
272
+ attempt_status : None ,
273
+ connector_transaction_id : None ,
274
+ }
275
+ }
276
+
277
+ fn is_response_success ( rc : & String ) -> bool {
278
+ rc == "0"
279
+ }
280
+
266
281
impl
267
282
TryFrom <
268
283
ResponseRouterData <
@@ -286,16 +301,16 @@ impl
286
301
Some ( date) => date. chars ( ) . take ( 10 ) . collect ( ) ,
287
302
None => time:: OffsetDateTime :: now_utc ( ) . date ( ) . to_string ( ) ,
288
303
} ;
289
- match item. response . reference . clone ( ) {
290
- Some ( reference ) => Ok ( Self {
291
- status : if item . response . rc == "0" {
292
- match item . response . state . clone ( ) {
293
- Some ( state ) => common_enums :: AttemptStatus :: from ( state ) ,
294
- None => common_enums :: AttemptStatus :: Failure ,
295
- }
296
- } else {
297
- common_enums :: AttemptStatus :: Failure
298
- } ,
304
+ let response_code = item. response . rc . clone ( ) ;
305
+ let is_response_success = is_response_success ( & response_code ) ;
306
+
307
+ match (
308
+ item . response . reference . clone ( ) ,
309
+ item . response . state . clone ( ) ,
310
+ is_response_success ,
311
+ ) {
312
+ ( Some ( reference ) , Some ( state ) , true ) => Ok ( Self {
313
+ status : common_enums :: AttemptStatus :: from ( state ) ,
299
314
response : Ok ( PaymentsResponseData :: TransactionResponse {
300
315
resource_id : ResponseId :: NoResponseId ,
301
316
redirection_data : Box :: new ( Some ( RedirectForm :: Form {
@@ -340,8 +355,13 @@ impl
340
355
} ) ,
341
356
..item. data
342
357
} ) ,
343
- None => Ok ( Self {
358
+ _ => Ok ( Self {
344
359
status : common_enums:: AttemptStatus :: Failure ,
360
+ response : Err ( get_error_response (
361
+ response_code. clone ( ) ,
362
+ item. response . message . clone ( ) ,
363
+ item. http_code ,
364
+ ) ) ,
345
365
..item. data
346
366
} ) ,
347
367
}
@@ -367,27 +387,36 @@ impl
367
387
PaymentsResponseData ,
368
388
> ,
369
389
) -> Result < Self , Self :: Error > {
370
- Ok ( Self {
371
- status : if item. response . rc == "0" {
372
- match item. data . request . is_auto_capture ( ) ? {
390
+ let response_code = item. response . rc . clone ( ) ;
391
+ if is_response_success ( & response_code) {
392
+ Ok ( Self {
393
+ status : match item. data . request . is_auto_capture ( ) ? {
373
394
true => common_enums:: AttemptStatus :: Charged ,
374
395
false => common_enums:: AttemptStatus :: Authorized ,
375
- }
376
- } else {
377
- common_enums:: AttemptStatus :: Failure
378
- } ,
379
- response : Ok ( PaymentsResponseData :: TransactionResponse {
380
- resource_id : ResponseId :: ConnectorTransactionId ( item. response . tx_id ) ,
381
- redirection_data : Box :: new ( None ) ,
382
- mandate_reference : Box :: new ( None ) ,
383
- connector_metadata : None ,
384
- network_txn_id : None ,
385
- connector_response_reference_id : None ,
386
- incremental_authorization_allowed : None ,
387
- charge_id : None ,
388
- } ) ,
389
- ..item. data
390
- } )
396
+ } ,
397
+ response : Ok ( PaymentsResponseData :: TransactionResponse {
398
+ resource_id : ResponseId :: ConnectorTransactionId ( item. response . tx_id ) ,
399
+ redirection_data : Box :: new ( None ) ,
400
+ mandate_reference : Box :: new ( None ) ,
401
+ connector_metadata : None ,
402
+ network_txn_id : None ,
403
+ connector_response_reference_id : None ,
404
+ incremental_authorization_allowed : None ,
405
+ charge_id : None ,
406
+ } ) ,
407
+ ..item. data
408
+ } )
409
+ } else {
410
+ Ok ( Self {
411
+ status : common_enums:: AttemptStatus :: Failure ,
412
+ response : Err ( get_error_response (
413
+ response_code. clone ( ) ,
414
+ item. response . message . clone ( ) ,
415
+ item. http_code ,
416
+ ) ) ,
417
+ ..item. data
418
+ } )
419
+ }
391
420
}
392
421
}
393
422
@@ -570,27 +599,36 @@ impl
570
599
PaymentsResponseData ,
571
600
> ,
572
601
) -> Result < Self , Self :: Error > {
573
- Ok ( Self {
574
- status : if item. response . rc == "0" {
575
- match item. data . request . is_auto_capture ( ) ? {
602
+ let response_code = item. response . rc . clone ( ) ;
603
+ if is_response_success ( & response_code) {
604
+ Ok ( Self {
605
+ status : match item. data . request . is_auto_capture ( ) ? {
576
606
true => common_enums:: AttemptStatus :: Charged ,
577
607
false => common_enums:: AttemptStatus :: Authorized ,
578
- }
579
- } else {
580
- common_enums:: AttemptStatus :: Failure
581
- } ,
582
- response : Ok ( PaymentsResponseData :: TransactionResponse {
583
- resource_id : ResponseId :: ConnectorTransactionId ( item. response . tx_id ) ,
584
- redirection_data : Box :: new ( None ) ,
585
- mandate_reference : Box :: new ( None ) ,
586
- connector_metadata : None ,
587
- network_txn_id : None ,
588
- connector_response_reference_id : None ,
589
- incremental_authorization_allowed : None ,
590
- charge_id : None ,
591
- } ) ,
592
- ..item. data
593
- } )
608
+ } ,
609
+ response : Ok ( PaymentsResponseData :: TransactionResponse {
610
+ resource_id : ResponseId :: ConnectorTransactionId ( item. response . tx_id ) ,
611
+ redirection_data : Box :: new ( None ) ,
612
+ mandate_reference : Box :: new ( None ) ,
613
+ connector_metadata : None ,
614
+ network_txn_id : None ,
615
+ connector_response_reference_id : None ,
616
+ incremental_authorization_allowed : None ,
617
+ charge_id : None ,
618
+ } ) ,
619
+ ..item. data
620
+ } )
621
+ } else {
622
+ Ok ( Self {
623
+ status : common_enums:: AttemptStatus :: Failure ,
624
+ response : Err ( get_error_response (
625
+ response_code. clone ( ) ,
626
+ item. response . message . clone ( ) ,
627
+ item. http_code ,
628
+ ) ) ,
629
+ ..item. data
630
+ } )
631
+ }
594
632
}
595
633
}
596
634
@@ -637,24 +675,33 @@ impl
637
675
PaymentsResponseData ,
638
676
> ,
639
677
) -> Result < Self , Self :: Error > {
640
- Ok ( Self {
641
- response : Ok ( PaymentsResponseData :: TransactionResponse {
642
- resource_id : ResponseId :: ConnectorTransactionId ( item. response . tx_id ) ,
643
- redirection_data : Box :: new ( None ) ,
644
- mandate_reference : Box :: new ( None ) ,
645
- connector_metadata : None ,
646
- network_txn_id : None ,
647
- connector_response_reference_id : None ,
648
- incremental_authorization_allowed : None ,
649
- charge_id : None ,
650
- } ) ,
651
- status : if item. response . rc == "0" {
652
- common_enums:: AttemptStatus :: Charged
653
- } else {
654
- common_enums:: AttemptStatus :: Failure
655
- } ,
656
- ..item. data
657
- } )
678
+ let response_code = item. response . rc . clone ( ) ;
679
+ if is_response_success ( & response_code) {
680
+ Ok ( Self {
681
+ status : common_enums:: AttemptStatus :: Charged ,
682
+ response : Ok ( PaymentsResponseData :: TransactionResponse {
683
+ resource_id : ResponseId :: ConnectorTransactionId ( item. response . tx_id ) ,
684
+ redirection_data : Box :: new ( None ) ,
685
+ mandate_reference : Box :: new ( None ) ,
686
+ connector_metadata : None ,
687
+ network_txn_id : None ,
688
+ connector_response_reference_id : None ,
689
+ incremental_authorization_allowed : None ,
690
+ charge_id : None ,
691
+ } ) ,
692
+ ..item. data
693
+ } )
694
+ } else {
695
+ Ok ( Self {
696
+ status : common_enums:: AttemptStatus :: Failure ,
697
+ response : Err ( get_error_response (
698
+ response_code. clone ( ) ,
699
+ item. response . message . clone ( ) ,
700
+ item. http_code ,
701
+ ) ) ,
702
+ ..item. data
703
+ } )
704
+ }
658
705
}
659
706
}
660
707
677
724
PaymentsResponseData ,
678
725
> ,
679
726
) -> Result < Self , Self :: Error > {
680
- let status = if item. response . rc == "0" {
727
+ let response_code = item. response . rc . clone ( ) ;
728
+ let status = if is_response_success ( & response_code) {
681
729
item. response
682
730
. tx_action
683
731
. and_then ( |tx_action| match tx_action {
@@ -699,6 +747,15 @@ impl
699
747
Some ( common_enums:: AttemptStatus :: Failure )
700
748
} ;
701
749
match status {
750
+ Some ( common_enums:: AttemptStatus :: Failure ) => Ok ( Self {
751
+ status : common_enums:: AttemptStatus :: Failure ,
752
+ response : Err ( get_error_response (
753
+ response_code. clone ( ) ,
754
+ item. response . message . clone ( ) ,
755
+ item. http_code ,
756
+ ) ) ,
757
+ ..item. data
758
+ } ) ,
702
759
Some ( status) => Ok ( Self {
703
760
status,
704
761
..item. data
@@ -729,14 +786,23 @@ impl TryFrom<PaymentsCancelResponseRouterData<DeutschebankPaymentsResponse>>
729
786
fn try_from (
730
787
item : PaymentsCancelResponseRouterData < DeutschebankPaymentsResponse > ,
731
788
) -> Result < Self , Self :: Error > {
732
- Ok ( Self {
733
- status : if item. response . rc == "0" {
734
- common_enums:: AttemptStatus :: Voided
735
- } else {
736
- common_enums:: AttemptStatus :: VoidFailed
737
- } ,
738
- ..item. data
739
- } )
789
+ let response_code = item. response . rc . clone ( ) ;
790
+ if is_response_success ( & response_code) {
791
+ Ok ( Self {
792
+ status : common_enums:: AttemptStatus :: Voided ,
793
+ ..item. data
794
+ } )
795
+ } else {
796
+ Ok ( Self {
797
+ status : common_enums:: AttemptStatus :: VoidFailed ,
798
+ response : Err ( get_error_response (
799
+ response_code. clone ( ) ,
800
+ item. response . message . clone ( ) ,
801
+ item. http_code ,
802
+ ) ) ,
803
+ ..item. data
804
+ } )
805
+ }
740
806
}
741
807
}
742
808
@@ -763,17 +829,26 @@ impl TryFrom<RefundsResponseRouterData<Execute, DeutschebankPaymentsResponse>>
763
829
fn try_from (
764
830
item : RefundsResponseRouterData < Execute , DeutschebankPaymentsResponse > ,
765
831
) -> Result < Self , Self :: Error > {
766
- Ok ( Self {
767
- response : Ok ( RefundsResponseData {
768
- connector_refund_id : item. response . tx_id ,
769
- refund_status : if item. response . rc == "0" {
770
- enums:: RefundStatus :: Success
771
- } else {
772
- enums:: RefundStatus :: Failure
773
- } ,
774
- } ) ,
775
- ..item. data
776
- } )
832
+ let response_code = item. response . rc . clone ( ) ;
833
+ if is_response_success ( & response_code) {
834
+ Ok ( Self {
835
+ response : Ok ( RefundsResponseData {
836
+ connector_refund_id : item. response . tx_id ,
837
+ refund_status : enums:: RefundStatus :: Success ,
838
+ } ) ,
839
+ ..item. data
840
+ } )
841
+ } else {
842
+ Ok ( Self {
843
+ status : common_enums:: AttemptStatus :: Failure ,
844
+ response : Err ( get_error_response (
845
+ response_code. clone ( ) ,
846
+ item. response . message . clone ( ) ,
847
+ item. http_code ,
848
+ ) ) ,
849
+ ..item. data
850
+ } )
851
+ }
777
852
}
778
853
}
779
854
@@ -784,7 +859,8 @@ impl TryFrom<RefundsResponseRouterData<RSync, DeutschebankPaymentsResponse>>
784
859
fn try_from (
785
860
item : RefundsResponseRouterData < RSync , DeutschebankPaymentsResponse > ,
786
861
) -> Result < Self , Self :: Error > {
787
- let status = if item. response . rc == "0" {
862
+ let response_code = item. response . rc . clone ( ) ;
863
+ let status = if is_response_success ( & response_code) {
788
864
item. response
789
865
. tx_action
790
866
. and_then ( |tx_action| match tx_action {
@@ -803,7 +879,17 @@ impl TryFrom<RefundsResponseRouterData<RSync, DeutschebankPaymentsResponse>>
803
879
} else {
804
880
Some ( enums:: RefundStatus :: Failure )
805
881
} ;
882
+
806
883
match status {
884
+ Some ( enums:: RefundStatus :: Failure ) => Ok ( Self {
885
+ status : common_enums:: AttemptStatus :: Failure ,
886
+ response : Err ( get_error_response (
887
+ response_code. clone ( ) ,
888
+ item. response . message . clone ( ) ,
889
+ item. http_code ,
890
+ ) ) ,
891
+ ..item. data
892
+ } ) ,
807
893
Some ( refund_status) => Ok ( Self {
808
894
response : Ok ( RefundsResponseData {
809
895
refund_status,
0 commit comments