Skip to content

Commit 573fc2c

Browse files
authored
feat(connector): [DEUTSCHEBANK, FIUU ] Handle 2xx errors given by Connector (#6727)
1 parent fb3a49b commit 573fc2c

File tree

2 files changed

+211
-103
lines changed

2 files changed

+211
-103
lines changed

crates/hyperswitch_connectors/src/connectors/deutschebank/transformers.rs

Lines changed: 175 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use common_utils::{ext_traits::ValueExt, pii::Email, types::MinorUnit};
55
use error_stack::ResultExt;
66
use hyperswitch_domain_models::{
77
payment_method_data::{BankDebitData, PaymentMethodData},
8-
router_data::{AccessToken, ConnectorAuthType, RouterData},
8+
router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData},
99
router_flow_types::{
1010
payments::{Authorize, Capture, CompleteAuthorize, PSync},
1111
refunds::{Execute, RSync},
@@ -263,6 +263,21 @@ pub struct DeutschebankMandatePostResponse {
263263
state: Option<DeutschebankSEPAMandateStatus>,
264264
}
265265

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+
266281
impl
267282
TryFrom<
268283
ResponseRouterData<
@@ -286,16 +301,16 @@ impl
286301
Some(date) => date.chars().take(10).collect(),
287302
None => time::OffsetDateTime::now_utc().date().to_string(),
288303
};
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),
299314
response: Ok(PaymentsResponseData::TransactionResponse {
300315
resource_id: ResponseId::NoResponseId,
301316
redirection_data: Box::new(Some(RedirectForm::Form {
@@ -340,8 +355,13 @@ impl
340355
}),
341356
..item.data
342357
}),
343-
None => Ok(Self {
358+
_ => Ok(Self {
344359
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+
)),
345365
..item.data
346366
}),
347367
}
@@ -367,27 +387,36 @@ impl
367387
PaymentsResponseData,
368388
>,
369389
) -> 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()? {
373394
true => common_enums::AttemptStatus::Charged,
374395
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+
}
391420
}
392421
}
393422

@@ -570,27 +599,36 @@ impl
570599
PaymentsResponseData,
571600
>,
572601
) -> 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()? {
576606
true => common_enums::AttemptStatus::Charged,
577607
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+
}
594632
}
595633
}
596634

@@ -637,24 +675,33 @@ impl
637675
PaymentsResponseData,
638676
>,
639677
) -> 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+
}
658705
}
659706
}
660707

@@ -677,7 +724,8 @@ impl
677724
PaymentsResponseData,
678725
>,
679726
) -> 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) {
681729
item.response
682730
.tx_action
683731
.and_then(|tx_action| match tx_action {
@@ -699,6 +747,15 @@ impl
699747
Some(common_enums::AttemptStatus::Failure)
700748
};
701749
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+
}),
702759
Some(status) => Ok(Self {
703760
status,
704761
..item.data
@@ -729,14 +786,23 @@ impl TryFrom<PaymentsCancelResponseRouterData<DeutschebankPaymentsResponse>>
729786
fn try_from(
730787
item: PaymentsCancelResponseRouterData<DeutschebankPaymentsResponse>,
731788
) -> 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+
}
740806
}
741807
}
742808

@@ -763,17 +829,26 @@ impl TryFrom<RefundsResponseRouterData<Execute, DeutschebankPaymentsResponse>>
763829
fn try_from(
764830
item: RefundsResponseRouterData<Execute, DeutschebankPaymentsResponse>,
765831
) -> 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+
}
777852
}
778853
}
779854

@@ -784,7 +859,8 @@ impl TryFrom<RefundsResponseRouterData<RSync, DeutschebankPaymentsResponse>>
784859
fn try_from(
785860
item: RefundsResponseRouterData<RSync, DeutschebankPaymentsResponse>,
786861
) -> 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) {
788864
item.response
789865
.tx_action
790866
.and_then(|tx_action| match tx_action {
@@ -803,7 +879,17 @@ impl TryFrom<RefundsResponseRouterData<RSync, DeutschebankPaymentsResponse>>
803879
} else {
804880
Some(enums::RefundStatus::Failure)
805881
};
882+
806883
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+
}),
807893
Some(refund_status) => Ok(Self {
808894
response: Ok(RefundsResponseData {
809895
refund_status,

0 commit comments

Comments
 (0)