From b202c37ca15ee4e8c9038842a1023c1eceb1586d Mon Sep 17 00:00:00 2001 From: Tyler <48813565+technicallyty@users.noreply.github.com> Date: Wed, 23 Mar 2022 15:44:06 -0700 Subject: [PATCH] feat(marketplace): `QueryBuyOrders` ORM (#919) * feat: query buy orders * chore: address review Co-authored-by: technicallyty <48813565+tytech3@users.noreply.github.com> Co-authored-by: MD Aleem <72057206+aleem1314@users.noreply.github.com> --- x/ecocredit/keys.go | 4 +- .../server/marketplace/query_buy_orders.go | 78 ++++++++++++++++++- .../marketplace/query_buy_orders_test.go | 66 ++++++++++++++++ .../marketplace/query_orders_by_address.go | 11 --- .../marketplace/query_sell_order_test.go | 3 +- 5 files changed, 146 insertions(+), 16 deletions(-) create mode 100644 x/ecocredit/server/marketplace/query_buy_orders_test.go delete mode 100644 x/ecocredit/server/marketplace/query_orders_by_address.go diff --git a/x/ecocredit/keys.go b/x/ecocredit/keys.go index 9f1f924655..0cc172204b 100644 --- a/x/ecocredit/keys.go +++ b/x/ecocredit/keys.go @@ -3,15 +3,15 @@ package ecocredit import ( "fmt" + ormapi "github.com/cosmos/cosmos-sdk/api/cosmos/orm/v1alpha1" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/address" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - ormapi "github.com/cosmos/cosmos-sdk/api/cosmos/orm/v1alpha1" - "github.com/regen-network/regen-ledger/types/math" basketapi "github.com/regen-network/regen-ledger/api/regen/ecocredit/basket/v1" marketApi "github.com/regen-network/regen-ledger/api/regen/ecocredit/marketplace/v1" api "github.com/regen-network/regen-ledger/api/regen/ecocredit/v1" + "github.com/regen-network/regen-ledger/types/math" ) const ( diff --git a/x/ecocredit/server/marketplace/query_buy_orders.go b/x/ecocredit/server/marketplace/query_buy_orders.go index 3fca4393cb..46d0a7dcd9 100644 --- a/x/ecocredit/server/marketplace/query_buy_orders.go +++ b/x/ecocredit/server/marketplace/query_buy_orders.go @@ -3,9 +3,83 @@ package marketplace import ( "context" + "github.com/cosmos/cosmos-sdk/orm/model/ormlist" + sdk "github.com/cosmos/cosmos-sdk/types" + + api "github.com/regen-network/regen-ledger/api/regen/ecocredit/marketplace/v1" + "github.com/regen-network/regen-ledger/types/ormutil" "github.com/regen-network/regen-ledger/x/ecocredit/marketplace" ) -func (k Keeper) BuyOrders(context.Context, *marketplace.QueryBuyOrdersRequest) (*marketplace.QueryBuyOrdersResponse, error) { - panic("not implemented") +// BuyOrders queries all buy orders with optional pagination +func (k Keeper) BuyOrders(ctx context.Context, request *marketplace.QueryBuyOrdersRequest) (*marketplace.QueryBuyOrdersResponse, error) { + pg, err := ormutil.GogoPageReqToPulsarPageReq(request.Pagination) + if err != nil { + return nil, err + } + + it, err := k.stateStore.BuyOrderTable().List(ctx, api.BuyOrderPrimaryKey{}, ormlist.Paginate(pg)) + if err != nil { + return nil, err + } + defer it.Close() + + orders := make([]*marketplace.BuyOrder, 0, 10) + for it.Next() { + v, err := it.Value() + if err != nil { + return nil, err + } + var order marketplace.BuyOrder + if err = ormutil.PulsarToGogoSlow(v, &order); err != nil { + return nil, err + } + orders = append(orders, &order) + } + + pr, err := ormutil.PulsarPageResToGogoPageRes(it.PageResponse()) + if err != nil { + return nil, err + } + + return &marketplace.QueryBuyOrdersResponse{BuyOrders: orders, Pagination: pr}, nil +} + +// BuyOrdersByAddress queries all buy orders created by the given address with optional pagination +func (k Keeper) BuyOrdersByAddress(ctx context.Context, request *marketplace.QueryBuyOrdersByAddressRequest) (*marketplace.QueryBuyOrdersByAddressResponse, error) { + pg, err := ormutil.GogoPageReqToPulsarPageReq(request.Pagination) + if err != nil { + return nil, err + } + + buyer, err := sdk.AccAddressFromBech32(request.Address) + if err != nil { + return nil, err + } + + it, err := k.stateStore.BuyOrderTable().List(ctx, api.BuyOrderBuyerIndexKey{}.WithBuyer(buyer), ormlist.Paginate(pg)) + if err != nil { + return nil, err + } + defer it.Close() + + orders := make([]*marketplace.BuyOrder, 0, 10) + for it.Next() { + v, err := it.Value() + if err != nil { + return nil, err + } + var order marketplace.BuyOrder + if err = ormutil.PulsarToGogoSlow(v, &order); err != nil { + return nil, err + } + orders = append(orders, &order) + } + + pr, err := ormutil.PulsarPageResToGogoPageRes(it.PageResponse()) + if err != nil { + return nil, err + } + + return &marketplace.QueryBuyOrdersByAddressResponse{BuyOrders: orders, Pagination: pr}, nil } diff --git a/x/ecocredit/server/marketplace/query_buy_orders_test.go b/x/ecocredit/server/marketplace/query_buy_orders_test.go new file mode 100644 index 0000000000..8ab3a348f9 --- /dev/null +++ b/x/ecocredit/server/marketplace/query_buy_orders_test.go @@ -0,0 +1,66 @@ +package marketplace + +import ( + "testing" + + "gotest.tools/v3/assert" + + "github.com/cosmos/cosmos-sdk/testutil/testdata" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/query" + + api "github.com/regen-network/regen-ledger/api/regen/ecocredit/marketplace/v1" + "github.com/regen-network/regen-ledger/x/ecocredit/marketplace" +) + +func TestQueryBuyOrders(t *testing.T) { + t.Parallel() + s := setupBase(t) + assert.NilError(t, s.marketStore.BuyOrderTable().Insert(s.ctx, &api.BuyOrder{Buyer: s.addr})) + assert.NilError(t, s.marketStore.BuyOrderTable().Insert(s.ctx, &api.BuyOrder{Buyer: s.addr})) + + res, err := s.k.BuyOrders(s.ctx, &marketplace.QueryBuyOrdersRequest{}) + assert.NilError(t, err) + assert.Equal(t, 2, len(res.BuyOrders)) + + res, err = s.k.BuyOrders(s.ctx, &marketplace.QueryBuyOrdersRequest{Pagination: &query.PageRequest{Limit: 1, CountTotal: true}}) + assert.NilError(t, err) + assert.Equal(t, 1, len(res.BuyOrders)) + assert.Equal(t, uint64(2), res.Pagination.Total) +} + +func TestQueryBuyOrdersByAddress(t *testing.T) { + t.Parallel() + s := setupBase(t) + _, _, otherAddr := testdata.KeyTestPubAddr() + _, _, noOrdersAddr := testdata.KeyTestPubAddr() + + assert.NilError(t, s.marketStore.BuyOrderTable().Insert(s.ctx, &api.BuyOrder{Buyer: s.addr})) + assert.NilError(t, s.marketStore.BuyOrderTable().Insert(s.ctx, &api.BuyOrder{Buyer: otherAddr})) + + // valid queries + res, err := s.k.BuyOrdersByAddress(s.ctx, &marketplace.QueryBuyOrdersByAddressRequest{Address: s.addr.String()}) + assert.NilError(t, err) + assert.Equal(t, 1, len(res.BuyOrders)) + assert.Equal(t, s.addr.String(), sdk.AccAddress(res.BuyOrders[0].Buyer).String()) + + res, err = s.k.BuyOrdersByAddress(s.ctx, &marketplace.QueryBuyOrdersByAddressRequest{Address: otherAddr.String()}) + assert.NilError(t, err) + assert.Equal(t, 1, len(res.BuyOrders)) + assert.Equal(t, otherAddr.String(), sdk.AccAddress(res.BuyOrders[0].Buyer).String()) + + res, err = s.k.BuyOrdersByAddress(s.ctx, &marketplace.QueryBuyOrdersByAddressRequest{Address: otherAddr.String(), Pagination: &query.PageRequest{CountTotal: true}}) + assert.NilError(t, err) + assert.Equal(t, 1, len(res.BuyOrders)) + assert.Equal(t, otherAddr.String(), sdk.AccAddress(res.BuyOrders[0].Buyer).String()) + assert.Equal(t, uint64(1), res.Pagination.Total) + + // empty slice for addr with no orders + res, err = s.k.BuyOrdersByAddress(s.ctx, &marketplace.QueryBuyOrdersByAddressRequest{Address: noOrdersAddr.String()}) + assert.NilError(t, err) + assert.Equal(t, 0, len(res.BuyOrders)) + + // error on bad address + res, err = s.k.BuyOrdersByAddress(s.ctx, &marketplace.QueryBuyOrdersByAddressRequest{Address: "foobarasdfxxlck"}) + assert.ErrorContains(t, err, "decoding bech32 failed") +} diff --git a/x/ecocredit/server/marketplace/query_orders_by_address.go b/x/ecocredit/server/marketplace/query_orders_by_address.go deleted file mode 100644 index cce8f44193..0000000000 --- a/x/ecocredit/server/marketplace/query_orders_by_address.go +++ /dev/null @@ -1,11 +0,0 @@ -package marketplace - -import ( - "context" - - "github.com/regen-network/regen-ledger/x/ecocredit/marketplace" -) - -func (k Keeper) BuyOrdersByAddress(context.Context, *marketplace.QueryBuyOrdersByAddressRequest) (*marketplace.QueryBuyOrdersByAddressResponse, error) { - panic("not implemented") -} diff --git a/x/ecocredit/server/marketplace/query_sell_order_test.go b/x/ecocredit/server/marketplace/query_sell_order_test.go index ca2f780ede..86cce98395 100644 --- a/x/ecocredit/server/marketplace/query_sell_order_test.go +++ b/x/ecocredit/server/marketplace/query_sell_order_test.go @@ -5,9 +5,10 @@ import ( "gotest.tools/v3/assert" + "google.golang.org/protobuf/types/known/timestamppb" + "github.com/cosmos/cosmos-sdk/orm/types/ormerrors" sdk "github.com/cosmos/cosmos-sdk/types" - "google.golang.org/protobuf/types/known/timestamppb" api "github.com/regen-network/regen-ledger/api/regen/ecocredit/marketplace/v1" "github.com/regen-network/regen-ledger/types/ormutil"