init
This commit is contained in:
56
lib/forum/network_supervisor.ex
Normal file
56
lib/forum/network_supervisor.ex
Normal file
@@ -0,0 +1,56 @@
|
||||
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
|
||||
Reference in New Issue
Block a user