defmodule ExDbmigrate.Table.Supervisor do
use DynamicSupervisor
alias __MODULE__, as: SUPERVISOR
alias ExDbmigrate.Table.Server, as: SERVER
@name :table_supervisor
@registry_name :tables
def child_spec() do
%{
id: __MODULE__,
start: {__MODULE__, :start_link, []},
type: :supervisor
}
end
def start_link(init_arg) do
DynamicSupervisor.start_link(__MODULE__, init_arg, name: @name)
end
def start_link() do
DynamicSupervisor.start_link(__MODULE__, [], name: @name)
end
@impl true
def init(_) do
DynamicSupervisor.init(strategy: :one_for_one)
end
def start(opts \\ %{}) do
child_spec = {SERVER, opts}
DynamicSupervisor.start_child(@name, child_spec)
end
def stop(id) do
case Registry.lookup(@registry_name, id) do
[] ->
:ok
[{pid, _}] ->
Process.exit(pid, :shutdown)
:ok
end
end
def update_children() do
list()
|> Enum.each(fn x ->
SERVER.via_tuple(x)
|> GenServer.cast(:update)
end)
end
def whereis(id) do
case Registry.lookup(@registry_name, id) do
[{pid, _}] -> pid
[] -> nil
end
end
def find_or_create(id) do
if process_exists?(id) do
{:ok, id}
else
id |> start
end
end
def exists?(id) do
case Registry.lookup(@registry_name, id) do
[] -> false
_ -> true
end
end
def list do
DynamicSupervisor.which_children(@name)
|> Enum.map(fn {_, account_proc_pid, _, _} ->
Registry.keys(@registry_name, account_proc_pid)
|> List.first()
end)
|> Enum.sort()
end
def process_exists?(hash) do
case Registry.lookup(@registry_name, hash) do
[] -> false
_ -> true
end
end
end