Skip to content

Commit

Permalink
feat(wallets): add ik support (#1591)
Browse files Browse the repository at this point in the history
  • Loading branch information
gfyrag committed Jul 2, 2024
1 parent 6650368 commit 78ef89c
Show file tree
Hide file tree
Showing 31 changed files with 187 additions and 53 deletions.
5 changes: 2 additions & 3 deletions components/ledger/internal/api/v2/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"net/http"
"strings"

"github.com/formancehq/stack/libs/go-libs/api"
"github.com/formancehq/stack/libs/go-libs/bun/bunpaginate"

"github.com/formancehq/ledger/internal/engine/command"
Expand All @@ -28,10 +29,8 @@ func getCommandParameters(r *http.Request) command.Parameters {
dryRunAsString := r.URL.Query().Get("dryRun")
dryRun := strings.ToUpper(dryRunAsString) == "YES" || strings.ToUpper(dryRunAsString) == "TRUE" || dryRunAsString == "1"

idempotencyKey := r.Header.Get("Idempotency-Key")

return command.Parameters{
DryRun: dryRun,
IdempotencyKey: idempotencyKey,
IdempotencyKey: api.IdempotencyKeyFromRequest(r),
}
}
27 changes: 27 additions & 0 deletions ee/wallets/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,12 @@ paths:
operationId: updateWallet
tags:
- Wallets
parameters:
- name: Idempotency-Key
in: header
description: Use an idempotency key
schema:
type: string
requestBody:
content:
application/json:
Expand Down Expand Up @@ -323,6 +329,11 @@ paths:
required: true
schema:
type: string
- name: Idempotency-Key
in: header
description: Use an idempotency key
schema:
type: string
post:
summary: Debit a wallet
operationId: debitWallet
Expand Down Expand Up @@ -356,6 +367,11 @@ paths:
required: true
schema:
type: string
- name: Idempotency-Key
in: header
description: Use an idempotency key
schema:
type: string
post:
summary: Credit a wallet
operationId: creditWallet
Expand Down Expand Up @@ -467,6 +483,11 @@ paths:
required: true
schema:
type: string
- name: Idempotency-Key
in: header
description: Use an idempotency key
schema:
type: string
requestBody:
content:
application/json:
Expand All @@ -493,6 +514,11 @@ paths:
required: true
schema:
type: string
- name: Idempotency-Key
in: header
description: Use an idempotency key
schema:
type: string
post:
summary: Cancel a hold
operationId: voidHold
Expand Down Expand Up @@ -974,6 +1000,7 @@ components:
expiresAt:
type: string
format: date-time
nullable: true
priority:
type: integer
format: bigint
Expand Down
2 changes: 1 addition & 1 deletion ee/wallets/pkg/api/handler_balances_create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ func TestBalancesCreate(t *testing.T) {
appliedMetadata map[string]string
)
testEnv := newTestEnv(
WithAddMetadataToAccount(func(ctx context.Context, ledger, account string, metadata map[string]string) error {
WithAddMetadataToAccount(func(ctx context.Context, ledger, account, ik string, metadata map[string]string) error {
targetedLedger = ledger
targetedAccount = account
appliedMetadata = metadata
Expand Down
4 changes: 3 additions & 1 deletion ee/wallets/pkg/api/handler_holds_confirm.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"math/big"
"net/http"

"github.com/formancehq/stack/libs/go-libs/api"

wallet "github.com/formancehq/wallets/pkg"
"github.com/go-chi/chi/v5"
"github.com/go-chi/render"
Expand All @@ -28,7 +30,7 @@ func (m *MainHandler) confirmHoldHandler(w http.ResponseWriter, r *http.Request)
}
}

err := m.manager.ConfirmHold(r.Context(), wallet.ConfirmHold{
err := m.manager.ConfirmHold(r.Context(), api.IdempotencyKeyFromRequest(r), wallet.ConfirmHold{
HoldID: chi.URLParam(r, "holdID"),
Amount: big.NewInt(data.Amount),
Final: data.Final,
Expand Down
6 changes: 3 additions & 3 deletions ee/wallets/pkg/api/handler_holds_confirm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func TestHoldsConfirm(t *testing.T) {
Balances: balances,
}, nil
}),
WithCreateTransaction(func(ctx context.Context, name string, postTransaction wallet.PostTransaction) (*shared.V2Transaction, error) {
WithCreateTransaction(func(ctx context.Context, name, ik string, postTransaction wallet.PostTransaction) (*shared.V2Transaction, error) {
compareJSON(t, wallet.PostTransaction{
Script: &shared.V2PostTransactionScript{
Plain: wallet.BuildConfirmHoldScript(false, "USD"),
Expand Down Expand Up @@ -95,7 +95,7 @@ func TestHoldsPartialConfirm(t *testing.T) {
},
}, nil
}),
WithCreateTransaction(func(ctx context.Context, name string, postTransaction wallet.PostTransaction) (*shared.V2Transaction, error) {
WithCreateTransaction(func(ctx context.Context, name, ik string, postTransaction wallet.PostTransaction) (*shared.V2Transaction, error) {
compareJSON(t, wallet.PostTransaction{
Script: &shared.V2PostTransactionScript{
Plain: wallet.BuildConfirmHoldScript(false, "USD"),
Expand Down Expand Up @@ -230,7 +230,7 @@ func TestHoldsPartialConfirmWithFinal(t *testing.T) {
},
}, nil
}),
WithCreateTransaction(func(ctx context.Context, name string, script wallet.PostTransaction) (*shared.V2Transaction, error) {
WithCreateTransaction(func(ctx context.Context, name, ik string, script wallet.PostTransaction) (*shared.V2Transaction, error) {
compareJSON(t, wallet.PostTransaction{
Script: &shared.V2PostTransactionScript{
Plain: wallet.BuildConfirmHoldScript(true, "USD"),
Expand Down
4 changes: 3 additions & 1 deletion ee/wallets/pkg/api/handler_holds_void.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ import (
"errors"
"net/http"

"github.com/formancehq/stack/libs/go-libs/api"

wallet "github.com/formancehq/wallets/pkg"
"github.com/go-chi/chi/v5"
)

func (m *MainHandler) voidHoldHandler(w http.ResponseWriter, r *http.Request) {
err := m.manager.VoidHold(r.Context(), wallet.VoidHold{
err := m.manager.VoidHold(r.Context(), api.IdempotencyKeyFromRequest(r), wallet.VoidHold{
HoldID: chi.URLParam(r, "holdID"),
})
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion ee/wallets/pkg/api/handler_holds_void_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func TestHoldsVoid(t *testing.T) {
},
}, nil
}),
WithCreateTransaction(func(ctx context.Context, name string, script wallet.PostTransaction) (*shared.V2Transaction, error) {
WithCreateTransaction(func(ctx context.Context, name, ik string, script wallet.PostTransaction) (*shared.V2Transaction, error) {
compareJSON(t, wallet.PostTransaction{
Script: &shared.V2PostTransactionScript{
Plain: wallet.BuildCancelHoldScript("USD"),
Expand Down
2 changes: 1 addition & 1 deletion ee/wallets/pkg/api/handler_wallets_create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func TestWalletsCreate(t *testing.T) {
md map[string]string
)
testEnv := newTestEnv(
WithAddMetadataToAccount(func(ctx context.Context, l, a string, m map[string]string) error {
WithAddMetadataToAccount(func(ctx context.Context, l, a, ik string, m map[string]string) error {
ledger = l
account = a
md = m
Expand Down
4 changes: 3 additions & 1 deletion ee/wallets/pkg/api/handler_wallets_credit.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"errors"
"net/http"

"github.com/formancehq/stack/libs/go-libs/api"

wallet "github.com/formancehq/wallets/pkg"
"github.com/go-chi/chi/v5"
"github.com/go-chi/render"
Expand All @@ -29,7 +31,7 @@ func (m *MainHandler) creditWalletHandler(w http.ResponseWriter, r *http.Request
CreditRequest: *data,
}

err := m.manager.Credit(r.Context(), credit)
err := m.manager.Credit(r.Context(), api.IdempotencyKeyFromRequest(r), credit)
if err != nil {
switch {
case errors.Is(err, wallet.ErrBalanceNotExists),
Expand Down
2 changes: 1 addition & 1 deletion ee/wallets/pkg/api/handler_wallets_credit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ func TestWalletsCredit(t *testing.T) {
postTransaction wallet.PostTransaction
)
testEnv = newTestEnv(
WithCreateTransaction(func(ctx context.Context, ledger string, p wallet.PostTransaction) (*shared.V2Transaction, error) {
WithCreateTransaction(func(ctx context.Context, ledger, ik string, p wallet.PostTransaction) (*shared.V2Transaction, error) {
require.Equal(t, testEnv.LedgerName(), ledger)
postTransaction = p
return &testCase.postTransactionResult, nil
Expand Down
4 changes: 3 additions & 1 deletion ee/wallets/pkg/api/handler_wallets_debit.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"errors"
"net/http"

"github.com/formancehq/stack/libs/go-libs/api"

wallet "github.com/formancehq/wallets/pkg"
"github.com/go-chi/chi/v5"
"github.com/go-chi/render"
Expand All @@ -16,7 +18,7 @@ func (m *MainHandler) debitWalletHandler(w http.ResponseWriter, r *http.Request)
return
}

hold, err := m.manager.Debit(r.Context(), wallet.Debit{
hold, err := m.manager.Debit(r.Context(), api.IdempotencyKeyFromRequest(r), wallet.Debit{
WalletID: chi.URLParam(r, "walletID"),
DebitRequest: *data,
})
Expand Down
2 changes: 1 addition & 1 deletion ee/wallets/pkg/api/handler_wallets_debit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ func TestWalletsDebit(t *testing.T) {
},
}, nil
}),
WithCreateTransaction(func(ctx context.Context, ledger string, p wallet.PostTransaction) (*shared.V2Transaction, error) {
WithCreateTransaction(func(ctx context.Context, ledger, ik string, p wallet.PostTransaction) (*shared.V2Transaction, error) {
require.Equal(t, testEnv.LedgerName(), ledger)
postTransaction = p
if testCase.postTransactionError != nil {
Expand Down
4 changes: 3 additions & 1 deletion ee/wallets/pkg/api/handler_wallets_patch.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"errors"
"net/http"

"github.com/formancehq/stack/libs/go-libs/api"

wallet "github.com/formancehq/wallets/pkg"
"github.com/go-chi/chi/v5"
"github.com/go-chi/render"
Expand All @@ -16,7 +18,7 @@ func (m *MainHandler) patchWalletHandler(w http.ResponseWriter, r *http.Request)
return
}

err := m.manager.UpdateWallet(r.Context(), chi.URLParam(r, "walletID"), data)
err := m.manager.UpdateWallet(r.Context(), chi.URLParam(r, "walletID"), api.IdempotencyKeyFromRequest(r), data)
if err != nil {
switch {
case errors.Is(err, wallet.ErrWalletNotFound):
Expand Down
2 changes: 1 addition & 1 deletion ee/wallets/pkg/api/handler_wallets_patch_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func TestWalletsPatch(t *testing.T) {
},
}, nil
}),
WithAddMetadataToAccount(func(ctx context.Context, ledger, account string, md map[string]string) error {
WithAddMetadataToAccount(func(ctx context.Context, ledger, account, ik string, md map[string]string) error {
require.Equal(t, testEnv.LedgerName(), ledger)
require.Equal(t, testEnv.Chart().GetMainBalanceAccount(w.ID), account)
compareJSON(t, metadata.Metadata{
Expand Down
12 changes: 6 additions & 6 deletions ee/wallets/pkg/api/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,11 @@ func newTestEnv(opts ...Option) *testEnv {
}

type (
addMetadataToAccountFn func(ctx context.Context, ledger, account string, metadata map[string]string) error
addMetadataToAccountFn func(ctx context.Context, ledger, account, ik string, metadata map[string]string) error
getAccountFn func(ctx context.Context, ledger, account string) (*wallet.AccountWithVolumesAndBalances, error)
listAccountsFn func(ctx context.Context, ledger string, query wallet.ListAccountsQuery) (*wallet.AccountsCursorResponseCursor, error)
listTransactionsFn func(ctx context.Context, ledger string, query wallet.ListTransactionsQuery) (*shared.V2TransactionsCursorResponseCursor, error)
createTransactionFn func(ctx context.Context, ledger string, postTransaction wallet.PostTransaction) (*shared.V2Transaction, error)
createTransactionFn func(ctx context.Context, ledger, ik string, postTransaction wallet.PostTransaction) (*shared.V2Transaction, error)
)

type LedgerMock struct {
Expand All @@ -111,8 +111,8 @@ func (l *LedgerMock) EnsureLedgerExists(ctx context.Context, name string) error
return nil
}

func (l *LedgerMock) AddMetadataToAccount(ctx context.Context, ledger, account string, metadata map[string]string) error {
return l.addMetadataToAccount(ctx, ledger, account, metadata)
func (l *LedgerMock) AddMetadataToAccount(ctx context.Context, ledger, account, ik string, metadata map[string]string) error {
return l.addMetadataToAccount(ctx, ledger, account, ik, metadata)
}

func (l *LedgerMock) GetAccount(ctx context.Context, ledger, account string) (*wallet.AccountWithVolumesAndBalances, error) {
Expand All @@ -123,8 +123,8 @@ func (l *LedgerMock) ListAccounts(ctx context.Context, ledger string, query wall
return l.listAccounts(ctx, ledger, query)
}

func (l *LedgerMock) CreateTransaction(ctx context.Context, ledger string, postTransaction wallet.PostTransaction) (*shared.V2Transaction, error) {
return l.createTransaction(ctx, ledger, postTransaction)
func (l *LedgerMock) CreateTransaction(ctx context.Context, ledger, ik string, postTransaction wallet.PostTransaction) (*shared.V2Transaction, error) {
return l.createTransaction(ctx, ledger, ik, postTransaction)
}

func (l *LedgerMock) ListTransactions(ctx context.Context, ledger string, query wallet.ListTransactionsQuery) (*shared.V2TransactionsCursorResponseCursor, error) {
Expand Down
18 changes: 10 additions & 8 deletions ee/wallets/pkg/ledger_interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,11 +98,11 @@ func (c AccountsCursorResponseCursor) GetHasMore() bool {

type Ledger interface {
EnsureLedgerExists(ctx context.Context, name string) error
AddMetadataToAccount(ctx context.Context, ledger, account string, metadata map[string]string) error
AddMetadataToAccount(ctx context.Context, ledger, account, ik string, metadata map[string]string) error
GetAccount(ctx context.Context, ledger, account string) (*AccountWithVolumesAndBalances, error)
ListAccounts(ctx context.Context, ledger string, query ListAccountsQuery) (*AccountsCursorResponseCursor, error)
ListTransactions(ctx context.Context, ledger string, query ListTransactionsQuery) (*shared.V2TransactionsCursorResponseCursor, error)
CreateTransaction(ctx context.Context, ledger string, postTransaction PostTransaction) (*shared.V2Transaction, error)
CreateTransaction(ctx context.Context, ledger, ik string, postTransaction PostTransaction) (*shared.V2Transaction, error)
}

type DefaultLedger struct {
Expand Down Expand Up @@ -179,7 +179,7 @@ func (d DefaultLedger) ListTransactions(ctx context.Context, ledger string, q Li
return &rsp.V2TransactionsCursorResponse.Cursor, nil
}

func (d DefaultLedger) CreateTransaction(ctx context.Context, ledger string, transaction PostTransaction) (*shared.V2Transaction, error) {
func (d DefaultLedger) CreateTransaction(ctx context.Context, ledger, ik string, transaction PostTransaction) (*shared.V2Transaction, error) {
ret, err := d.client.Ledger.V2CreateTransaction(ctx, operations.V2CreateTransactionRequest{
V2PostTransaction: shared.V2PostTransaction{
Metadata: transaction.Metadata,
Expand All @@ -193,7 +193,8 @@ func (d DefaultLedger) CreateTransaction(ctx context.Context, ledger string, tra
return &transaction.Timestamp.Time
}(),
},
Ledger: ledger,
Ledger: ledger,
IdempotencyKey: pointer.For(ik),
})
if err != nil {
return nil, err
Expand All @@ -202,12 +203,13 @@ func (d DefaultLedger) CreateTransaction(ctx context.Context, ledger string, tra
return &ret.V2CreateTransactionResponse.Data, nil
}

func (d DefaultLedger) AddMetadataToAccount(ctx context.Context, ledger, account string, metadata map[string]string) error {
func (d DefaultLedger) AddMetadataToAccount(ctx context.Context, ledger, account, ik string, metadata map[string]string) error {

_, err := d.client.Ledger.V2AddMetadataToAccount(ctx, operations.V2AddMetadataToAccountRequest{
RequestBody: metadata,
Address: account,
Ledger: ledger,
RequestBody: metadata,
Address: account,
Ledger: ledger,
IdempotencyKey: pointer.For(ik),
})
if err != nil {
return err
Expand Down
Loading

0 comments on commit 78ef89c

Please sign in to comment.