Current section

Files

Jump to
moon lib moon_web mock_db transactions.ex
Raw

lib/moon_web/mock_db/transactions.ex

defmodule MoonWeb.MockDB.Transactions do
@moduledoc false
use GenServer
alias MoonWeb.MockDB.{Currencies, Sites, Users}
alias MoonWeb.MockDB.Utils
@process_name :mock_transactions
@statuses ["COMPLETE", "CANCELLED", "PENDING"]
# client
def start_link do
GenServer.start_link(__MODULE__, [], name: @process_name)
end
def list(
args = %{
filter: %{user: _, site: _, currency: _},
pagination: %{offset: _, limit: _}
}
) do
this_process() |> GenServer.call({:list, args})
end
def list_all, do: this_process() |> GenServer.call(:list_all)
# server
def init(_args) do
users = Users.list_all()
{:ok,
%{
all:
users
|> Enum.flat_map(fn user ->
0..Faker.random_between(0, 100)
|> Enum.map(fn _ ->
%{
id: Utils.random_id(),
user: user,
site: Sites.random().name,
currency: Currencies.random().name,
amount: Faker.random_between(0, 100_000),
status: Utils.get_random_item(@statuses),
created_at: Faker.DateTime.backward(120)
}
end)
end)
}}
end
def handle_call(:list_all, _from, state) do
{:reply, state.all, state}
end
def handle_call({:list, args}, _from, state) do
%{
filter: %{user: user_filter, site: sites, currency: currencies},
pagination: %{offset: offset, limit: limit}
} = args
users = Users.list(%{filter: user_filter})
results =
state.all
|> Enum.filter(fn txn ->
Enum.member?(users, txn.user) and
(Enum.empty?(sites) or Enum.member?(sites, txn.site)) and
(Enum.empty?(currencies) or Enum.member?(sites, txn.currency))
end)
|> Utils.take_page(offset, limit)
{:reply, results, state}
end
# helpers
defp this_process do
Process.whereis(@process_name)
end
end