Skip to content

Commit

Permalink
feat: webhook
Browse files Browse the repository at this point in the history
  • Loading branch information
brokeyourbike committed Aug 30, 2023
1 parent dee76c8 commit 037cb2f
Show file tree
Hide file tree
Showing 10 changed files with 640 additions and 0 deletions.
56 changes: 56 additions & 0 deletions webhook/accounts.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package webhook

import "github.com/google/uuid"

type AccountType string

const (
AccountTypeCurrent AccountType = "CurrentAccount"
AccountTypeDeposit AccountType = "DepositAccount"
AccountTypeControl AccountType = "ControlAccount"
AccountTypeSegregatedClient AccountType = "SegregatedClientAccount"
AccountTypeInstitution AccountType = "InstitutionAccount"
)

// WebhookAccountCreatedPayload
// This webhook confirms the account has been created
type WebhookAccountCreatedPayload struct {
AccountID uuid.UUID `json:"AccountId" validate:"required"`
AccountName string `json:"AccountName" validate:"required"`
AccountHolderLabel string `json:"AccountHolderLabel" validate:"required"`
AccountIdentifiers struct {
IBAN string `json:"IBAN" validate:"required"`
BBAN string `json:"BBAN" validate:"required"`
} `json:"AccountIdentifiers" validate:"required"`
TimestampCreated string `json:"TimestampCreated" validate:"required"`
AccountType AccountType `json:"AccountType" validate:"required"`
}

type DisabledReason string

const (
DisabledReasonAccountClosed DisabledReason = "AccountClosed"
DisabledReasonAccountSuspended DisabledReason = "AccountSuspended"
)

// WebhookAccountDisabledPayload
type WebhookAccountDisabledPayload struct {
AccountID uuid.UUID `json:"AccountId" validate:"required"`
DisabledReason DisabledReason `json:"DisabledReason" validate:"required"`
DisabledTimestamp string `json:"DisabledTimestamp" validate:"required"`
}

// WebhookVirtualAccountCreationFailedPayload
// This webhook confirms a virtual account creation failure
type WebhookVirtualAccountCreationFailedPayload struct {
AccountID uuid.UUID `json:"AccountId" validate:"required"`
VirtualAccountID uuid.UUID `json:"VirtualAccountId" validate:"required"`
AccountIdentifier struct {
IBAN string `json:"Iban" validate:"required"`
BBAN string `json:"Bban" validate:"required"`
ExternalIdentifier string `json:"ExternalIdentifier"`
} `json:"AccountIdentifier" validate:"required"`
Errors map[string]string `json:"Errors" validate:"required"`
OwnerName string `json:"OwnerName"`
TimestampCreated string `json:"TimestampCreated" validate:"required"`
}
88 changes: 88 additions & 0 deletions webhook/fx.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package webhook

import (
"github.com/brokeyourbike/clearbank-api-client-go"
"github.com/google/uuid"
)

// WebhookFxTradeExecutedPayload
// This webhook confirms that the FX trade has been executed
type WebhookFxTradeExecutedPayload struct {
SellAccountOwner string `json:"SellAccountOwner" validate:"required"`
SellAccountIBAN string `json:"SellAccountIban" validate:"required"`
BuyAccountOwner string `json:"BuyAccountOwner" validate:"required"`
BuyAccountIBAN string `json:"BuyAccountIban" validate:"required"`
Attestation string `json:"Attestation" validate:"required"`
ValueDate clearbank.Time `json:"ValueDate" validate:"required"`
InstructedAmount float64 `json:"InstructedAmount" validate:"required"`
FixedSide clearbank.FixedSide `json:"FixedSide" validate:"required"`
BuyCurrency string `json:"BuyCurrency" validate:"required"`
SellCurrency string `json:"SellCurrency" validate:"required"`
Margin float64 `json:"Margin"`
MarginAccountIBAN string `json:"MarginAccountIban"`
EndToEndID string `json:"EndToEndId" validate:"required"`
UnstructuredInformation string `json:"UnstructuredInformation"`
Symbol string `json:"Symbol" validate:"required"`
FIReceivedMarginAmount float64 `json:"FIReceivedMarginAmount"`
BuyAmount float64 `json:"BuyAmount" validate:"required"`
SellAmount float64 `json:"SellAmount" validate:"required"`
ClearbankRate float64 `json:"ClearBankRate" validate:"required"`
FIRate float64 `json:"FIRate" validate:"required"`
RequestedTime clearbank.Time `json:"RequestedTime" validate:"required"`
ExecutedTime clearbank.Time `json:"ExecutedTime" validate:"required"`
}

// WebhookFxTradeSettledPayload
// This webhook confirms that the FX trade has been settled
type WebhookFxTradeSettledPayload struct {
SellAccountOwner string `json:"SellAccountOwner" validate:"required"`
SellAccountIBAN string `json:"SellAccountIban" validate:"required"`
BuyAccountOwner string `json:"BuyAccountOwner" validate:"required"`
BuyAccountIBAN string `json:"BuyAccountIban" validate:"required"`
Attestation string `json:"Attestation" validate:"required"`
ValueDate clearbank.Time `json:"ValueDate" validate:"required"`
InstructedAmount float64 `json:"InstructedAmount" validate:"required"`
FixedSide clearbank.FixedSide `json:"FixedSide" validate:"required"`
BuyCurrency string `json:"BuyCurrency" validate:"required"`
SellCurrency string `json:"SellCurrency" validate:"required"`
Margin float64 `json:"Margin"`
MarginAccountIBAN string `json:"MarginAccountIban"`
EndToEndID string `json:"EndToEndId" validate:"required"`
UnstructuredInformation string `json:"UnstructuredInformation"`
DebitTransactionID uuid.UUID `json:"DebitTransactionId" validate:"required"`
DebitAmount float64 `json:"DebitAmount" validate:"required"`
DebitCurrency string `json:"DebitCurrency" validate:"required"`
DebitCreatedAt clearbank.Time `json:"DebitCreatedAt" validate:"required"`
DebitSettledAt clearbank.Time `json:"DebitSettledAt" validate:"required"`
CreditTransactionID uuid.UUID `json:"CreditTransactionId" validate:"required"`
CreditAmount float64 `json:"CreditAmount" validate:"required"`
CreditCurrency string `json:"CreditCurrency" validate:"required"`
CreditCreatedAt clearbank.Time `json:"CreditCreatedAt" validate:"required"`
CreditSettledAt clearbank.Time `json:"CreditSettledAt" validate:"required"`
MarginTransactionID *uuid.UUID `json:"MarginTransactionId"`
MarginAmount float64 `json:"MarginAmount"`
MarginCurrency string `json:"MarginCurrency"`
MarginCreatedAt string `json:"MarginCreatedAt"`
MarginSettledAt string `json:"MarginSettledAt"`
}

// WebhookFxTradeCancelledPayload
// This webhook confirms that the FX trade has been canceled
type WebhookFxTradeCancelledPayload struct {
SellAccountOwner string `json:"SellAccountOwner" validate:"required"`
SellAccountIBAN string `json:"SellAccountIban" validate:"required"`
BuyAccountOwner string `json:"BuyAccountOwner" validate:"required"`
BuyAccountIBAN string `json:"BuyAccountIban" validate:"required"`
Attestation string `json:"Attestation" validate:"required"`
ValueDate clearbank.Time `json:"ValueDate" validate:"required"`
InstructedAmount float64 `json:"InstructedAmount" validate:"required"`
FixedSide string `json:"FixedSide" validate:"required"`
BuyCurrency string `json:"BuyCurrency" validate:"required"`
SellCurrency string `json:"SellCurrency" validate:"required"`
Margin float64 `json:"Margin"`
MarginAccountIBAN string `json:"MarginAccountIban"`
EndToEndID string `json:"EndToEndId" validate:"required"`
UnstructuredInformation string `json:"UnstructuredInformation"`
CancellationCode string `json:"CancellationCode" validate:"required"`
CancellationReason string `json:"CancellationReason" validate:"required"`
}
25 changes: 25 additions & 0 deletions webhook/internal.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package webhook

// WebhookMCInternalTransfersSettledPayload
// This webhook confirms that a multicurrency internal transfer request has been settled
type WebhookMCInternalTransfersSettledPayload struct {
EndToEndID string `json:"EndToEndId" validate:"required"`
InstructedCurrency string `json:"InstructedCurrency" validate:"required"`
InstructedAmount float64 `json:"InstructedAmount" validate:"required"`
DebitAccountIBAN string `json:"DebitAccountIban"`
CreditAccountIBAN string `json:"CreditAccountIban"`
Reference string `json:"Reference"`
}

// WebhookMCInternalTransfersCancelledPayload
// This webhook confirms that a multicurrency internal transfer request has been canceled
type WebhookMCInternalTransfersCancelledPayload struct {
CancellationCode string `json:"CancellationCode" validate:"required"`
FailureReasons []string `json:"FailureReasons" validate:"required"`
EndToEndID string `json:"EndToEndId" validate:"required"`
InstructedCurrency string `json:"InstructedCurrency" validate:"required"`
InstructedAmount float64 `json:"InstructedAmount" validate:"required"`
DebitAccountIBAN string `json:"DebitAccountIban"`
CreditAccountIBAN string `json:"CreditAccountIban"`
Reference string `json:"Reference"`
}
83 changes: 83 additions & 0 deletions webhook/mccy_accounts.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package webhook

import (
"github.com/brokeyourbike/clearbank-api-client-go"
"github.com/google/uuid"
)

type IdentifierKind string

const (
IdentifierKindIBAN IdentifierKind = "IBAN"
IdentifierKindBBAN IdentifierKind = "IBAN"
IdentifierKindAccountID IdentifierKind = "AccountId"
IdentifierKindDescriptor IdentifierKind = "Descriptor"
)

type MCCYIdentifier struct {
Identifier string `json:"Identifier" validate:"required"`
Kind IdentifierKind `json:"Kind" validate:"required"`
}

// WebhookMCAccountCreatedPayload
// This webhook confirms that the multicurrency account has been created
type WebhookMCAccountCreatedPayload struct {
AccountID uuid.UUID `json:"AccountId" validate:"required"`
Name string `json:"Name" validate:"required"`
Label string `json:"Label" validate:"required"`
Owner string `json:"Owner" validate:"required"`
Kind clearbank.MCCYAccountKind `json:"Kind" validate:"required"`
Currencies []string `json:"Currencies" validate:"required"`
Status clearbank.MCCYAccountStatus `json:"Status" validate:"required"`
ProductID string `json:"ProductId"`
CustomerID string `json:"CustomerId"`
TimestampCreated clearbank.Time `json:"TimestampCreated" validate:"required"`
Identifiers []MCCYIdentifier `json:"Identifiers" validate:"required"`
Type string `json:"Type" validate:"required"`
}

// WebhookMCAccountUpdatedPayload
// This webhook confirms that the multicurrency account has been updated
type WebhookMCAccountUpdatedPayload struct {
AccountID uuid.UUID `json:"AccountId" validate:"required"`
Name string `json:"Name" validate:"required"`
Label string `json:"Label" validate:"required"`
Owner string `json:"Owner" validate:"required"`
Kind clearbank.MCCYAccountKind `json:"Kind" validate:"required"`
Currencies []string `json:"Currencies" validate:"required"`
Status clearbank.MCCYAccountStatus `json:"Status" validate:"required"`
ProductID string `json:"ProductId"`
CustomerID string `json:"CustomerId"`
TimestampCreated clearbank.Time `json:"TimestampCreated" validate:"required"`
TimestampModified clearbank.Time `json:"TimestampModified" validate:"required"`
StatusReason string `json:"StatusReason"`
StatusInformation string `json:"StatusInformation"`
Identifiers []MCCYIdentifier `json:"Identifiers" validate:"required"`
Type string `json:"Type" validate:"required"`
}

// WebhookMCVirtualAccountCreatedPayload
// This webhook confirms that the multicurrency virtual account has been created
type WebhookMCVirtualAccountCreatedPayload struct {
AccountID uuid.UUID `json:"AccountId" validate:"required"`
VirtualAccountID uuid.UUID `json:"VirtualAccountId" validate:"required"`
BatchID uuid.UUID `json:"BatchId" validate:"required"`
Owner string `json:"Owner" validate:"required"`
Status clearbank.MCCYAccountStatus `json:"Status" validate:"required"`
Identifiers []MCCYIdentifier `json:"Identifiers" validate:"required"`
TimestampCreated clearbank.Time `json:"TimestampCreated" validate:"required"`
}

// WebhookMCVirtualAccountUpdatedPayload
// This webhook confirms that the multicurrency virtual account has been updated
type WebhookMCVirtualAccountUpdatedPayload struct {
AccountID uuid.UUID `json:"AccountId" validate:"required"`
VirtualAccountID uuid.UUID `json:"VirtualAccountId" validate:"required"`
Owner string `json:"Owner" validate:"required"`
Status clearbank.MCCYAccountStatus `json:"Status" validate:"required"`
Identifiers []MCCYIdentifier `json:"Identifiers" validate:"required"`
TimestampCreated clearbank.Time `json:"TimestampCreated" validate:"required"`
TimestampModified clearbank.Time `json:"TimestampModified" validate:"required"`
StatusReason string `json:"StatusReason"`
StatusInformation string `json:"StatusInformation"`
}
Loading

0 comments on commit 037cb2f

Please sign in to comment.