Skip to content

Commit 8d53c66

Browse files
feat(connector): [Gocardless] Add mandate webhoooks (#2468)
1 parent 4149965 commit 8d53c66

File tree

2 files changed

+59
-2
lines changed

2 files changed

+59
-2
lines changed

crates/router/src/connector/gocardless.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -746,6 +746,12 @@ impl api::IncomingWebhook for Gocardless {
746746
api_models::webhooks::RefundIdType::ConnectorRefundId(link.refund.to_owned());
747747
api::webhooks::ObjectReferenceId::RefundId(refund_id)
748748
}
749+
transformers::WebhooksLink::MandateWebhookLink(link) => {
750+
let mandate_id = api_models::webhooks::MandateIdType::ConnectorMandateId(
751+
link.mandate.to_owned(),
752+
);
753+
api::webhooks::ObjectReferenceId::MandateId(mandate_id)
754+
}
749755
};
750756
Ok(reference_id)
751757
}
@@ -792,6 +798,27 @@ impl api::IncomingWebhook for Gocardless {
792798
api::IncomingWebhookEvent::EventNotSupported
793799
}
794800
},
801+
transformers::WebhookAction::MandatesAction(action) => match action {
802+
transformers::MandatesAction::Active | transformers::MandatesAction::Reinstated => {
803+
api::IncomingWebhookEvent::MandateActive
804+
}
805+
transformers::MandatesAction::Expired
806+
| transformers::MandatesAction::Cancelled
807+
| transformers::MandatesAction::Failed
808+
| transformers::MandatesAction::Consumed => {
809+
api::IncomingWebhookEvent::MandateRevoked
810+
}
811+
transformers::MandatesAction::Created
812+
| transformers::MandatesAction::CustomerApprovalGranted
813+
| transformers::MandatesAction::CustomerApprovalSkipped
814+
| transformers::MandatesAction::Transferred
815+
| transformers::MandatesAction::Submitted
816+
| transformers::MandatesAction::ResubmissionRequested
817+
| transformers::MandatesAction::Replaced
818+
| transformers::MandatesAction::Blocked => {
819+
api::IncomingWebhookEvent::EventNotSupported
820+
}
821+
},
795822
};
796823
Ok(event_type)
797824
}
@@ -817,6 +844,9 @@ impl api::IncomingWebhook for Gocardless {
817844
transformers::WebhookResourceType::Refunds => serde_json::to_value(first_event)
818845
.into_report()
819846
.change_context(errors::ConnectorError::WebhookBodyDecodingFailed),
847+
transformers::WebhookResourceType::Mandates => serde_json::to_value(first_event)
848+
.into_report()
849+
.change_context(errors::ConnectorError::WebhookBodyDecodingFailed),
820850
}
821851
}
822852
}

crates/router/src/connector/gocardless/transformers.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -873,13 +873,15 @@ pub struct WebhookEvent {
873873
pub enum WebhookResourceType {
874874
Payments,
875875
Refunds,
876+
Mandates,
876877
}
877878

878879
#[derive(Debug, Serialize, Deserialize)]
879880
#[serde(untagged)]
880881
pub enum WebhookAction {
881882
PaymentsAction(PaymentsAction),
882883
RefundsAction(RefundsAction),
884+
MandatesAction(MandatesAction),
883885
}
884886

885887
#[derive(Debug, Serialize, Deserialize)]
@@ -909,11 +911,31 @@ pub enum RefundsAction {
909911
FundsReturned,
910912
}
911913

914+
#[derive(Debug, Serialize, Deserialize)]
915+
#[serde(rename_all = "snake_case")]
916+
pub enum MandatesAction {
917+
Created,
918+
CustomerApprovalGranted,
919+
CustomerApprovalSkipped,
920+
Active,
921+
Cancelled,
922+
Failed,
923+
Transferred,
924+
Expired,
925+
Submitted,
926+
ResubmissionRequested,
927+
Reinstated,
928+
Replaced,
929+
Consumed,
930+
Blocked,
931+
}
932+
912933
#[derive(Debug, Serialize, Deserialize)]
913934
#[serde(untagged)]
914935
pub enum WebhooksLink {
915936
PaymentWebhooksLink(PaymentWebhooksLink),
916937
RefundWebhookLink(RefundWebhookLink),
938+
MandateWebhookLink(MandateWebhookLink),
917939
}
918940

919941
#[derive(Debug, Serialize, Deserialize)]
@@ -926,12 +948,17 @@ pub struct PaymentWebhooksLink {
926948
pub payment: String,
927949
}
928950

951+
#[derive(Debug, Serialize, Deserialize)]
952+
pub struct MandateWebhookLink {
953+
pub mandate: String,
954+
}
955+
929956
impl TryFrom<&WebhookEvent> for GocardlessPaymentsResponse {
930957
type Error = error_stack::Report<errors::ConnectorError>;
931958
fn try_from(item: &WebhookEvent) -> Result<Self, Self::Error> {
932959
let id = match &item.links {
933960
WebhooksLink::PaymentWebhooksLink(link) => link.payment.to_owned(),
934-
WebhooksLink::RefundWebhookLink(_) => {
961+
WebhooksLink::RefundWebhookLink(_) | WebhooksLink::MandateWebhookLink(_) => {
935962
Err(errors::ConnectorError::WebhookEventTypeNotFound)?
936963
}
937964
};
@@ -962,7 +989,7 @@ impl TryFrom<&WebhookAction> for GocardlessPaymentStatus {
962989
| PaymentsAction::ResubmissionRequired
963990
| PaymentsAction::Created => Err(errors::ConnectorError::WebhookEventTypeNotFound)?,
964991
},
965-
WebhookAction::RefundsAction(_) => {
992+
WebhookAction::RefundsAction(_) | WebhookAction::MandatesAction(_) => {
966993
Err(errors::ConnectorError::WebhookEventTypeNotFound)?
967994
}
968995
}

0 commit comments

Comments
 (0)