From aad92e6ea887745609ab17bcaedd6a04f2e863e0 Mon Sep 17 00:00:00 2001 From: Unnawut Date: Fri, 31 Aug 2018 11:53:18 +0700 Subject: [PATCH] Add filtering to transaction controller --- .../v1/controllers/transaction_controller.ex | 27 ++++++++++++++++++- .../transaction_controller_test.exs | 24 +++++++++++++++++ .../transaction_controller_test.exs | 24 +++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) diff --git a/apps/admin_api/lib/admin_api/v1/controllers/transaction_controller.ex b/apps/admin_api/lib/admin_api/v1/controllers/transaction_controller.ex index 145193b6c..1af2a73d2 100644 --- a/apps/admin_api/lib/admin_api/v1/controllers/transaction_controller.ex +++ b/apps/admin_api/lib/admin_api/v1/controllers/transaction_controller.ex @@ -5,7 +5,7 @@ defmodule AdminAPI.V1.TransactionController do use AdminAPI, :controller import AdminAPI.V1.ErrorHandler alias EWallet.TransactionGate - alias EWallet.Web.{SearchParser, SortParser, Paginator, Preloader} + alias EWallet.Web.{FilterParser, SearchParser, SortParser, Paginator, Preloader} alias EWallet.TransactionPolicy alias EWalletDB.{Repo, Transaction, User, Account} alias Ecto.Changeset @@ -22,6 +22,30 @@ defmodule AdminAPI.V1.TransactionController do # Note that these values *must be in the schema associations*. @preload_fields [:from_token, :to_token] + # The fields that are allowed to be filtered. + @filter_fields [ + # From + from_amount: nil, + from_token: [:id, :name, :symbol, :inserted_at, :created_at], + from_wallet: [:address, :name, :identifier, :inserted_at, :created_at], + from_account: [:id, :name, :inserted_at, :created_at], + from_user: [:id, :username, :email, :provider_user_id, :inserted_at, :created_at], + # To + to_amount: nil, + to_token: [:id, :name, :symbol], + to_wallet: [:address, :name, :identifier], + to_account: [:id, :name, :inserted_at, :created_at], + to_user: [:id, :username, :email, :provider_user_id, :inserted_at, :created_at], + # Exchange + exchange_account: [:id, :name, :inserted_at, :created_at], + exchange_wallet: [:address, :name, :identifier, :inserted_at, :created_at], + # Other data + status: nil, + type: nil, + inserted_at: nil, + updated_at: nil + ] + # The fields that are allowed to be searched. # Note that these values here *must be the DB column names* # Because requests cannot customize which fields to search (yet!), @@ -149,6 +173,7 @@ defmodule AdminAPI.V1.TransactionController do defp query_records_and_respond(query, attrs, conn) do query |> Preloader.to_query(@preload_fields) + |> FilterParser.to_query(attrs, @filter_fields) |> SearchParser.to_query(attrs, @search_fields) |> SortParser.to_query(attrs, @sort_fields, @mapped_fields) |> Paginator.paginate_attrs(attrs) diff --git a/apps/admin_api/test/admin_api/v1/controllers/admin_auth/transaction_controller_test.exs b/apps/admin_api/test/admin_api/v1/controllers/admin_auth/transaction_controller_test.exs index 14a1d4bb6..adec0c6a4 100644 --- a/apps/admin_api/test/admin_api/v1/controllers/admin_auth/transaction_controller_test.exs +++ b/apps/admin_api/test/admin_api/v1/controllers/admin_auth/transaction_controller_test.exs @@ -203,6 +203,30 @@ defmodule AdminAPI.V1.AdminAuth.TransactionControllerTest do assert transaction_1["id"] == meta.mint.transaction.id assert transaction_2["id"] == meta.init_transaction_1.id end + + test "returns filtered transactions", meta do + response = + admin_user_request("/transaction.all", %{ + "filters" => [ + %{ + "field" => "from_wallet.address", + "comparator" => "eq", + "value" => meta.wallet_4.address + } + ] + }) + + transactions = response["data"]["data"] + + refute Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_1.id end) + refute Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_2.id end) + refute Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_3.id end) + refute Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_4.id end) + refute Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_5.id end) + refute Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_6.id end) + assert Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_7.id end) + assert Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_8.id end) + end end describe "/account.get_transactions" do diff --git a/apps/admin_api/test/admin_api/v1/controllers/provider_auth/transaction_controller_test.exs b/apps/admin_api/test/admin_api/v1/controllers/provider_auth/transaction_controller_test.exs index 908ffd91a..f159faf8a 100644 --- a/apps/admin_api/test/admin_api/v1/controllers/provider_auth/transaction_controller_test.exs +++ b/apps/admin_api/test/admin_api/v1/controllers/provider_auth/transaction_controller_test.exs @@ -203,6 +203,30 @@ defmodule AdminAPI.V1.ProviderAuth.TransactionControllerTest do assert transaction_1["id"] == meta.mint.transaction.id assert transaction_2["id"] == meta.init_transaction_1.id end + + test "returns filtered transactions", meta do + response = + provider_request("/transaction.all", %{ + "filters" => [ + %{ + "field" => "from_wallet.address", + "comparator" => "eq", + "value" => meta.wallet_4.address + } + ] + }) + + transactions = response["data"]["data"] + + refute Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_1.id end) + refute Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_2.id end) + refute Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_3.id end) + refute Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_4.id end) + refute Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_5.id end) + refute Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_6.id end) + assert Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_7.id end) + assert Enum.any?(transactions, fn txn -> txn["id"] == meta.transaction_8.id end) + end end describe "/account.get_transactions" do