defmodule Localiser.Localisation.Room.Supervisor do use DynamicSupervisor alias Localiser.Domain.Rooms alias Localiser.Localisation.Room.Server def start_link(floor) do case DynamicSupervisor.start_link(__MODULE__, :ok, name: via(floor.id)) do {:ok, pid} -> seed_rooms(floor.id) {:ok, pid} error -> error end end def via(floor_id) do {:via, Registry, {Localiser.Registry, {:room_supervisor, floor_id}}} end @impl true def init(:ok) do DynamicSupervisor.init(strategy: :one_for_one) end def start_room_server(floor_id, room) do child_spec = %{ id: {Server, room.id}, start: {Server, :start_link, [room]}, restart: :transient } DynamicSupervisor.start_child(via(floor_id), child_spec) end defp seed_rooms(floor_id) do Rooms.list_rooms_for_floor(floor_id) |> Enum.each(&start_room_server(floor_id, &1)) end end