From 5864c6b2dcd59b3a592b5bba6deb95b4faad4bd5 Mon Sep 17 00:00:00 2001 From: Paul Nicolas Date: Thu, 30 Jan 2025 16:42:41 +0100 Subject: [PATCH] fix(atlar): fix payout creation and polling statuses --- .../engine/workflow/create_payout.go | 6 ++-- .../engine/workflow/create_payout_test.go | 2 +- .../plugins/public/atlar/client/accounts.go | 4 +-- .../plugins/public/atlar/client/client.go | 36 +++++++++++++++---- .../public/atlar/client/counter_parties.go | 4 +-- .../public/atlar/client/external_accounts.go | 4 +-- .../public/atlar/client/third_parties.go | 2 +- .../public/atlar/client/transactions.go | 4 +-- .../plugins/public/atlar/client/transfers.go | 4 +-- 9 files changed, 44 insertions(+), 22 deletions(-) diff --git a/internal/connectors/engine/workflow/create_payout.go b/internal/connectors/engine/workflow/create_payout.go index 3869c55fc..57faa3b69 100644 --- a/internal/connectors/engine/workflow/create_payout.go +++ b/internal/connectors/engine/workflow/create_payout.go @@ -129,13 +129,13 @@ func (w Workflow) createPayout( Every: config.PollingPeriod, }, Action: client.ScheduleWorkflowAction{ - Workflow: RunPollTransfer, + Workflow: RunPollPayout, Args: []interface{}{ - PollTransfer{ + PollPayout{ TaskID: createPayout.TaskID, ConnectorID: createPayout.ConnectorID, PaymentInitiationID: createPayout.PaymentInitiationID, - TransferID: *createPayoutResponse.PollingPayoutID, + PayoutID: *createPayoutResponse.PollingPayoutID, ScheduleID: scheduleID, }, }, diff --git a/internal/connectors/engine/workflow/create_payout_test.go b/internal/connectors/engine/workflow/create_payout_test.go index ada4b4383..d15201af8 100644 --- a/internal/connectors/engine/workflow/create_payout_test.go +++ b/internal/connectors/engine/workflow/create_payout_test.go @@ -106,7 +106,7 @@ func (s *UnitTestSuite) Test_CreatePayout_WithPollingPayment_Success() { }) s.env.OnActivity(activities.TemporalScheduleCreateActivity, mock.Anything, mock.Anything).Once().Return(func(ctx context.Context, options activities.ScheduleCreateOptions) error { s.Contains(options.ScheduleID, "polling-payout") - s.Equal(RunPollTransfer, options.Action.Workflow) + s.Equal(RunPollPayout, options.Action.Workflow) return nil }) diff --git a/internal/connectors/plugins/public/atlar/client/accounts.go b/internal/connectors/plugins/public/atlar/client/accounts.go index c19f7786a..d34d7caac 100644 --- a/internal/connectors/plugins/public/atlar/client/accounts.go +++ b/internal/connectors/plugins/public/atlar/client/accounts.go @@ -15,7 +15,7 @@ func (c *client) GetV1AccountsID(ctx context.Context, id string) (*accounts.GetV } resp, err := c.client.Accounts.GetV1AccountsID(&accountsParams) - return resp, wrapSDKErr(err) + return resp, wrapSDKErr(err, &accounts.GetV1AccountsIDNotFound{}) } func (c *client) GetV1Accounts(ctx context.Context, token string, pageSize int64) (*accounts.GetV1AccountsOK, error) { @@ -27,5 +27,5 @@ func (c *client) GetV1Accounts(ctx context.Context, token string, pageSize int64 } resp, err := c.client.Accounts.GetV1Accounts(&accountsParams) - return resp, wrapSDKErr(err) + return resp, wrapSDKErr(err, nil) } diff --git a/internal/connectors/plugins/public/atlar/client/client.go b/internal/connectors/plugins/public/atlar/client/client.go index d3788b660..8939faf93 100644 --- a/internal/connectors/plugins/public/atlar/client/client.go +++ b/internal/connectors/plugins/public/atlar/client/client.go @@ -2,6 +2,7 @@ package client import ( "context" + "errors" "fmt" "net/http" "net/url" @@ -66,25 +67,46 @@ func createAtlarClient(baseURL *url.URL, accessKey, secret string) *atlar_client return client } +type ErrorCodeReader interface { + Code() int +} + // wrap a public error for cases that we don't want to retry // so that activities can classify this error for temporal -func wrapSDKErr(err error) error { +func wrapSDKErr(err error, atlarErr any) error { if err == nil { return nil } - atlarErr, ok := err.(*runtime.APIError) - if !ok { - return err + var code int + switch { + case atlarErr == nil: + var atlarError *runtime.APIError + if !errors.As(err, &atlarError) { + return err + } + code = atlarError.Code + + default: + if !errors.As(err, &atlarErr) { + return err + } + + reader, ok := atlarErr.(ErrorCodeReader) + if !ok { + return err + } + + code = reader.Code() } - if atlarErr.Code == http.StatusTooManyRequests { + if code == http.StatusTooManyRequests { return fmt.Errorf("atlar error: %w: %w", err, httpwrapper.ErrStatusCodeTooManyRequests) } - if atlarErr.Code >= http.StatusBadRequest && atlarErr.Code < http.StatusInternalServerError { + if code >= http.StatusBadRequest && code < http.StatusInternalServerError { return fmt.Errorf("atlar error: %w: %w", err, httpwrapper.ErrStatusCodeClientError) - } else if atlarErr.Code >= http.StatusInternalServerError { + } else if code >= http.StatusInternalServerError { return fmt.Errorf("atlar error: %w: %w", err, httpwrapper.ErrStatusCodeServerError) } diff --git a/internal/connectors/plugins/public/atlar/client/counter_parties.go b/internal/connectors/plugins/public/atlar/client/counter_parties.go index c2532f7e0..e5c849b0c 100644 --- a/internal/connectors/plugins/public/atlar/client/counter_parties.go +++ b/internal/connectors/plugins/public/atlar/client/counter_parties.go @@ -18,7 +18,7 @@ func (c *client) GetV1CounterpartiesID(ctx context.Context, counterPartyID strin HTTPClient: c.httpClient, } counterpartyResponse, err := c.client.Counterparties.GetV1CounterpartiesID(&getCounterpartyParams) - return counterpartyResponse, wrapSDKErr(err) + return counterpartyResponse, wrapSDKErr(err, &counterparties.GetV1CounterpartiesIDNotFound{}) } func (c *client) PostV1CounterParties(ctx context.Context, newExternalBankAccount models.BankAccount) (*counterparties.PostV1CounterpartiesCreated, error) { @@ -61,7 +61,7 @@ func (c *client) PostV1CounterParties(ctx context.Context, newExternalBankAccoun } postCounterpartiesResponse, err := c.client.Counterparties.PostV1Counterparties(&postCounterpartiesParams) if err != nil { - return nil, wrapSDKErr(err) + return nil, wrapSDKErr(err, &counterparties.PostV1CounterpartiesBadRequest{}) } if len(postCounterpartiesResponse.Payload.ExternalAccounts) != 1 { diff --git a/internal/connectors/plugins/public/atlar/client/external_accounts.go b/internal/connectors/plugins/public/atlar/client/external_accounts.go index d31773b72..16f8cb821 100644 --- a/internal/connectors/plugins/public/atlar/client/external_accounts.go +++ b/internal/connectors/plugins/public/atlar/client/external_accounts.go @@ -15,7 +15,7 @@ func (c *client) GetV1ExternalAccountsID(ctx context.Context, externalAccountID } externalAccountResponse, err := c.client.ExternalAccounts.GetV1ExternalAccountsID(&getExternalAccountParams) - return externalAccountResponse, wrapSDKErr(err) + return externalAccountResponse, wrapSDKErr(err, &external_accounts.GetV1ExternalAccountsIDNotFound{}) } func (c *client) GetV1ExternalAccounts(ctx context.Context, token string, pageSize int64) (*external_accounts.GetV1ExternalAccountsOK, error) { @@ -27,5 +27,5 @@ func (c *client) GetV1ExternalAccounts(ctx context.Context, token string, pageSi } resp, err := c.client.ExternalAccounts.GetV1ExternalAccounts(&externalAccountsParams) - return resp, wrapSDKErr(err) + return resp, wrapSDKErr(err, nil) } diff --git a/internal/connectors/plugins/public/atlar/client/third_parties.go b/internal/connectors/plugins/public/atlar/client/third_parties.go index 08ff0cfb9..5756ae2ed 100644 --- a/internal/connectors/plugins/public/atlar/client/third_parties.go +++ b/internal/connectors/plugins/public/atlar/client/third_parties.go @@ -15,5 +15,5 @@ func (c *client) GetV1BetaThirdPartiesID(ctx context.Context, id string) (*third } resp, err := c.client.ThirdParties.GetV1betaThirdPartiesID(¶ms) - return resp, wrapSDKErr(err) + return resp, wrapSDKErr(err, &third_parties.GetV1betaThirdPartiesIDNotFound{}) } diff --git a/internal/connectors/plugins/public/atlar/client/transactions.go b/internal/connectors/plugins/public/atlar/client/transactions.go index b2d626932..b47594abb 100644 --- a/internal/connectors/plugins/public/atlar/client/transactions.go +++ b/internal/connectors/plugins/public/atlar/client/transactions.go @@ -16,7 +16,7 @@ func (c *client) GetV1Transactions(ctx context.Context, token string, pageSize i } resp, err := c.client.Transactions.GetV1Transactions(¶ms) - return resp, wrapSDKErr(err) + return resp, wrapSDKErr(err, nil) } func (c *client) GetV1TransactionsID(ctx context.Context, id string) (*transactions.GetV1TransactionsIDOK, error) { @@ -27,5 +27,5 @@ func (c *client) GetV1TransactionsID(ctx context.Context, id string) (*transacti } resp, err := c.client.Transactions.GetV1TransactionsID(¶ms) - return resp, wrapSDKErr(err) + return resp, wrapSDKErr(err, &transactions.GetV1TransactionsIDNotFound{}) } diff --git a/internal/connectors/plugins/public/atlar/client/transfers.go b/internal/connectors/plugins/public/atlar/client/transfers.go index 777567a52..c481d240a 100644 --- a/internal/connectors/plugins/public/atlar/client/transfers.go +++ b/internal/connectors/plugins/public/atlar/client/transfers.go @@ -16,7 +16,7 @@ func (c *client) PostV1CreditTransfers(ctx context.Context, req *atlar_models.Cr } resp, err := c.client.CreditTransfers.PostV1CreditTransfers(&postCreditTransfersParams) - return resp, wrapSDKErr(err) + return resp, wrapSDKErr(err, &credit_transfers.PostV1CreditTransfersBadRequest{}) } func (c *client) GetV1CreditTransfersGetByExternalIDExternalID(ctx context.Context, externalID string) (*credit_transfers.GetV1CreditTransfersGetByExternalIDExternalIDOK, error) { @@ -27,5 +27,5 @@ func (c *client) GetV1CreditTransfersGetByExternalIDExternalID(ctx context.Conte } resp, err := c.client.CreditTransfers.GetV1CreditTransfersGetByExternalIDExternalID(&getCreditTransferParams) - return resp, wrapSDKErr(err) + return resp, wrapSDKErr(err, &credit_transfers.GetV1CreditTransfersGetByExternalIDExternalIDNotFound{}) }