init: inital commit
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
defmodule Localiser.Localisation.Sensor.Supervisor do
|
||||
use DynamicSupervisor
|
||||
|
||||
alias Localiser.Domain.{Rooms, Sensors}
|
||||
alias Localiser.Localisation.Sensor.Server
|
||||
|
||||
def start_link(floor) do
|
||||
case DynamicSupervisor.start_link(__MODULE__, :ok, name: via(floor.id)) do
|
||||
{:ok, pid} ->
|
||||
seed_sensors(floor.id)
|
||||
{:ok, pid}
|
||||
|
||||
error ->
|
||||
error
|
||||
end
|
||||
end
|
||||
|
||||
def via(floor_id) do
|
||||
{:via, Registry, {Localiser.Registry, {:sensor_supervisor, floor_id}}}
|
||||
end
|
||||
|
||||
@impl true
|
||||
def init(:ok) do
|
||||
DynamicSupervisor.init(strategy: :one_for_one)
|
||||
end
|
||||
|
||||
def start_sensor_server(floor_id, sensor, room) do
|
||||
child_spec = %{
|
||||
id: {Server, sensor.id},
|
||||
start: {Server, :start_link, [{sensor, room}]},
|
||||
restart: :transient
|
||||
}
|
||||
|
||||
DynamicSupervisor.start_child(via(floor_id), child_spec)
|
||||
end
|
||||
|
||||
defp seed_sensors(floor_id) do
|
||||
Rooms.list_rooms_for_floor(floor_id)
|
||||
|> Enum.each(fn room ->
|
||||
Sensors.list_sensors_for_room(room.id)
|
||||
|> Enum.each(&start_sensor_server(floor_id, &1, room))
|
||||
end)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user