Packages
moon
2.77.0
2.90.5
retired
2.90.4
2.90.3
2.90.2
2.90.1
2.90.0
2.89.4
2.89.1
2.89.0
2.88.0
2.87.11
2.87.10
2.87.9
2.87.8
2.87.7
2.87.6
2.87.5
2.87.4
2.87.3
2.87.2
2.87.1
2.87.0
2.86.1
2.86.0
2.85.1
2.85.0
2.84.0
2.83.0
2.82.0
2.81.4
2.81.3
2.81.2
2.81.1
2.81.0
2.80.2
2.80.1
2.80.0
2.79.13
2.79.12
2.79.11
2.79.10
2.79.9
2.79.8
2.79.7
2.79.6
2.79.5
2.79.4
2.79.3
2.79.2
2.79.1
2.79.0
2.78.4
2.78.3
2.78.2
2.78.1
2.78.0
2.77.0
2.76.5
2.76.4
2.76.3
2.76.2
2.76.1
2.76.0
2.75.0
2.74.1
2.74.0
2.73.8
2.73.7
2.73.6
2.73.5
2.73.4
2.73.3
2.73.2
2.73.1
2.73.0
2.72.5
2.72.4
2.72.3
2.72.2
2.72.1
2.72.0
2.71.1
2.71.0
2.70.0
2.69.2
2.69.1
2.69.0
2.68.11
2.68.10
Components-based design system written in elixir
Current section
Files
Jump to
Current section
Files
lib/moon_web/mock_db/users.ex
defmodule MoonWeb.MockDB.Users do
@moduledoc false
use GenServer
alias MoonWeb.MockDB.{Countries, Sites}
alias MoonWeb.MockDB.Utils
@process_name :mock_users
# client
def start_link do
GenServer.start_link(__MODULE__, [], name: @process_name)
end
def list(
args = %{
filter: %{id: _, country: _, site: _},
sort: _
}
) do
this_process() |> GenServer.call({:list, args})
end
def list_all, do: this_process() |> GenServer.call(:list_all)
def search_by_usernames(""), do: []
def search_by_usernames(search_text) do
this_process()
|> GenServer.call({:search_usernames, search_text})
end
# server
def init(_args) do
countries = Countries.list_all()
{:ok,
%{
all:
0..1000
|> Enum.flat_map(fn _ ->
Sites.random_list()
|> Enum.map(fn site ->
%{
id: Utils.random_id(),
name: Faker.Person.name(),
email: Faker.Internet.email(),
country: Faker.Util.pick(countries).name,
username: Faker.Internet.user_name(),
site: site.name,
signup_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: %{id: id, country: country, site: site}, sort: sort} = args
results =
state.all
|> Enum.sort(fn a, b -> sort_users(a, b, sort) end)
|> Enum.filter(fn user ->
(Enum.empty?(id) or Enum.member?(id, user.id)) and
(Enum.empty?(site) or Enum.member?(site, user.site)) and
(Enum.empty?(country) or Enum.member?(country, user.country))
end)
{:reply, results, state}
end
def handle_call({:search_usernames, search_text}, _from, state) do
results =
state.all
|> Enum.filter(&String.contains?(&1.username, search_text))
{:reply, results, state}
end
defp sort_users(a, b, sort) do
case sort do
%{id: :asc} -> a.id < b.id
%{id: :desc} -> a.id >= b.id
%{username: :asc} -> a.username < b.username
%{username: :desc} -> a.username >= b.username
_ -> true
end
end
# helpers
defp this_process do
Process.whereis(@process_name)
end
end