57 lines
1.2 KiB
Elixir
57 lines
1.2 KiB
Elixir
defmodule Forum.Networks do
|
|
@moduledoc """
|
|
Starts one network process for each forms network the app serves.
|
|
"""
|
|
use DynamicSupervisor
|
|
|
|
def start_link(opts) do
|
|
DynamicSupervisor.start_link(__MODULE__, opts, name: __MODULE__)
|
|
end
|
|
|
|
@impl true
|
|
def init(_opts) do
|
|
DynamicSupervisor.init(strategy: :one_for_one)
|
|
end
|
|
|
|
def get_or_start(slug) when is_binary(slug) do
|
|
key = Forum.Network.normalize_slug(slug)
|
|
|
|
case Registry.lookup(Forum.ProcessRegistry, {:network, key}) do
|
|
[{pid, _}] ->
|
|
{:ok, pid}
|
|
|
|
[] ->
|
|
spec = {Forum.Network, slug: key}
|
|
|
|
case DynamicSupervisor.start_child(__MODULE__, spec) do
|
|
{:ok, pid} -> {:ok, pid}
|
|
{:error, {:already_started, pid}} -> {:ok, pid}
|
|
other -> other
|
|
end
|
|
end
|
|
end
|
|
|
|
def networks do
|
|
Forum.ProcessRegistry
|
|
|> Registry.select([
|
|
{{{:network, :"$1"}, :"$2", :_}, [], [{{:"$1", :"$2"}}]}
|
|
])
|
|
end
|
|
|
|
def start_networks do
|
|
for slug <- network_slugs() do
|
|
get_or_start(slug)
|
|
end
|
|
|
|
:ok
|
|
end
|
|
|
|
def network_slugs do
|
|
"networks/*"
|
|
|> Forum.Assets.paths()
|
|
|> Enum.filter(&File.dir?/1)
|
|
|> Enum.map(&Path.basename/1)
|
|
|> Enum.sort()
|
|
end
|
|
end
|