42 lines
934 B
Elixir
42 lines
934 B
Elixir
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
|