This commit is contained in:
Sam
2026-06-10 11:51:56 -05:00
commit 66ba338b81
57 changed files with 5509 additions and 0 deletions

View 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