From 0520e65a2903f3e6b0989c32b34e75fbef728027 Mon Sep 17 00:00:00 2001 From: Paul Nicolas Date: Tue, 26 Sep 2023 15:27:28 +0200 Subject: [PATCH] better wise errors --- .../app/connectors/modulr/client/error.go | 4 +- .../app/connectors/moneycorp/client/error.go | 4 +- .../app/connectors/wise/client/balances.go | 2 +- .../app/connectors/wise/client/error.go | 42 +++++++++++++++++++ .../app/connectors/wise/client/payouts.go | 14 +++---- .../app/connectors/wise/client/profiles.go | 2 +- .../app/connectors/wise/client/quotes.go | 6 ++- .../wise/client/recipient_accounts.go | 11 +++-- .../app/connectors/wise/client/transfers.go | 11 +++-- 9 files changed, 71 insertions(+), 25 deletions(-) create mode 100644 components/payments/internal/app/connectors/wise/client/error.go diff --git a/components/payments/internal/app/connectors/modulr/client/error.go b/components/payments/internal/app/connectors/modulr/client/error.go index 74885e2b93..2adea36119 100644 --- a/components/payments/internal/app/connectors/modulr/client/error.go +++ b/components/payments/internal/app/connectors/modulr/client/error.go @@ -28,7 +28,9 @@ func unmarshalError(statusCode int, body io.ReadCloser) *modulrError { _ = json.NewDecoder(body).Decode(&ces) if len(ces) == 0 { - return &modulrError{} + return &modulrError{ + StatusCode: statusCode, + } } return &modulrError{ diff --git a/components/payments/internal/app/connectors/moneycorp/client/error.go b/components/payments/internal/app/connectors/moneycorp/client/error.go index 0c2bfb9ee1..4f614be2af 100644 --- a/components/payments/internal/app/connectors/moneycorp/client/error.go +++ b/components/payments/internal/app/connectors/moneycorp/client/error.go @@ -30,7 +30,9 @@ func unmarshalError(statusCode int, body io.ReadCloser) *moneycorpError { _ = json.NewDecoder(body).Decode(&ces) if len(ces.Errors) == 0 { - return &moneycorpError{} + return &moneycorpError{ + StatusCode: statusCode, + } } return &moneycorpError{ diff --git a/components/payments/internal/app/connectors/wise/client/balances.go b/components/payments/internal/app/connectors/wise/client/balances.go index 4ee7ad6c3d..b3e9b537f8 100644 --- a/components/payments/internal/app/connectors/wise/client/balances.go +++ b/components/payments/internal/app/connectors/wise/client/balances.go @@ -48,7 +48,7 @@ func (w *Client) GetBalances(ctx context.Context, profileID uint64) ([]*Balance, defer res.Body.Close() if res.StatusCode != http.StatusOK { - return nil, fmt.Errorf("unexpected status code: %d", res.StatusCode) + return nil, unmarshalError(res.StatusCode, res.Body).Error() } var balances []*Balance diff --git a/components/payments/internal/app/connectors/wise/client/error.go b/components/payments/internal/app/connectors/wise/client/error.go new file mode 100644 index 0000000000..058479d7da --- /dev/null +++ b/components/payments/internal/app/connectors/wise/client/error.go @@ -0,0 +1,42 @@ +package client + +import ( + "encoding/json" + "fmt" + "io" +) + +type wiseErrors struct { + Errors []*wiseError `json:"errors"` +} + +type wiseError struct { + StatusCode int `json:"-"` + Code string `json:"code"` + Message string `json:"message"` +} + +func (me *wiseError) Error() error { + if me.Message == "" { + return fmt.Errorf("unexpected status code: %d", me.StatusCode) + } + + return fmt.Errorf("%d: %s", me.Code, me.Message) +} + +func unmarshalError(statusCode int, body io.ReadCloser) *wiseError { + var ces wiseErrors + _ = json.NewDecoder(body).Decode(&ces) + + if len(ces.Errors) == 0 { + return &wiseError{ + StatusCode: statusCode, + } + } + + return &wiseError{ + StatusCode: statusCode, + Code: ces.Errors[0].Code, + Message: ces.Errors[0].Message, + } +} diff --git a/components/payments/internal/app/connectors/wise/client/payouts.go b/components/payments/internal/app/connectors/wise/client/payouts.go index 624ad7ccc3..8dda74104d 100644 --- a/components/payments/internal/app/connectors/wise/client/payouts.go +++ b/components/payments/internal/app/connectors/wise/client/payouts.go @@ -71,18 +71,17 @@ func (w *Client) GetPayout(ctx context.Context, payoutID string) (*Payout, error if err != nil { return nil, err } + defer res.Body.Close() + + if res.StatusCode != http.StatusOK { + return nil, unmarshalError(res.StatusCode, res.Body).Error() + } body, err := io.ReadAll(res.Body) if err != nil { - res.Body.Close() - return nil, fmt.Errorf("failed to read response body: %w", err) } - if err = res.Body.Close(); err != nil { - return nil, fmt.Errorf("failed to close response body: %w", err) - } - var payout Payout err = json.Unmarshal(body, &payout) if err != nil { @@ -106,11 +105,10 @@ func (w *Client) CreatePayout(quote Quote, targetAccount uint64, transactionID s if err != nil { return nil, err } - defer res.Body.Close() if res.StatusCode != http.StatusOK { - return nil, fmt.Errorf("unexpected status code: %d", res.StatusCode) + return nil, unmarshalError(res.StatusCode, res.Body).Error() } var response Payout diff --git a/components/payments/internal/app/connectors/wise/client/profiles.go b/components/payments/internal/app/connectors/wise/client/profiles.go index 846f8b387f..deb0558ca3 100644 --- a/components/payments/internal/app/connectors/wise/client/profiles.go +++ b/components/payments/internal/app/connectors/wise/client/profiles.go @@ -28,7 +28,7 @@ func (w *Client) GetProfiles() ([]Profile, error) { } if res.StatusCode != http.StatusOK { - return nil, fmt.Errorf("unexpected status code: %d", res.StatusCode) + return nil, unmarshalError(res.StatusCode, res.Body).Error() } err = json.Unmarshal(body, &profiles) diff --git a/components/payments/internal/app/connectors/wise/client/quotes.go b/components/payments/internal/app/connectors/wise/client/quotes.go index 6957d51a4d..d2110cb7dd 100644 --- a/components/payments/internal/app/connectors/wise/client/quotes.go +++ b/components/payments/internal/app/connectors/wise/client/quotes.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "math/big" + "net/http" "github.com/google/uuid" ) @@ -30,9 +31,12 @@ func (w *Client) CreateQuote(profileID string, currency string, amount *big.Floa if err != nil { return response, err } - defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return response, unmarshalError(res.StatusCode, res.Body).Error() + } + body, err := io.ReadAll(res.Body) if err != nil { return response, fmt.Errorf("failed to read response body: %w", err) diff --git a/components/payments/internal/app/connectors/wise/client/recipient_accounts.go b/components/payments/internal/app/connectors/wise/client/recipient_accounts.go index 80005a736e..7ec1265125 100644 --- a/components/payments/internal/app/connectors/wise/client/recipient_accounts.go +++ b/components/payments/internal/app/connectors/wise/client/recipient_accounts.go @@ -32,18 +32,17 @@ func (w *Client) GetRecipientAccounts(ctx context.Context, profileID uint64) ([] if err != nil { return recipientAccounts, err } + defer res.Body.Close() + + if res.StatusCode != http.StatusOK { + return nil, unmarshalError(res.StatusCode, res.Body).Error() + } body, err := io.ReadAll(res.Body) if err != nil { - res.Body.Close() - return nil, fmt.Errorf("failed to read response body: %w", err) } - if err = res.Body.Close(); err != nil { - return nil, fmt.Errorf("failed to close response body: %w", err) - } - err = json.Unmarshal(body, &recipientAccounts) if err != nil { return nil, fmt.Errorf("failed to unmarshal transfers: %w", err) diff --git a/components/payments/internal/app/connectors/wise/client/transfers.go b/components/payments/internal/app/connectors/wise/client/transfers.go index ad839217ae..d89d764312 100644 --- a/components/payments/internal/app/connectors/wise/client/transfers.go +++ b/components/payments/internal/app/connectors/wise/client/transfers.go @@ -83,18 +83,17 @@ func (w *Client) GetTransfers(ctx context.Context, profile *Profile) ([]Transfer if err != nil { return transfers, err } + defer res.Body.Close() + + if res.StatusCode != http.StatusOK { + return nil, unmarshalError(res.StatusCode, res.Body).Error() + } body, err := io.ReadAll(res.Body) if err != nil { - res.Body.Close() - return nil, fmt.Errorf("failed to read response body: %w", err) } - if err = res.Body.Close(); err != nil { - return nil, fmt.Errorf("failed to close response body: %w", err) - } - var transferList []Transfer err = json.Unmarshal(body, &transferList)