62 lines
1.4 KiB
Elixir
62 lines
1.4 KiB
Elixir
defmodule Localiser.Domain.Rooms do
|
|
import Ecto.Query
|
|
|
|
alias Localiser.Repo
|
|
alias Localiser.Domain.Schema.Room
|
|
alias Localiser.Domain.Schema.Sensor
|
|
alias Localiser.Domain.Sensors
|
|
|
|
def list_rooms do
|
|
Repo.all(Room)
|
|
end
|
|
|
|
def any?, do: Repo.exists?(Room)
|
|
|
|
def list_rooms_for_floor(floor_id) do
|
|
Room
|
|
|> where([r], r.floor_id == ^floor_id)
|
|
|> Repo.all()
|
|
end
|
|
|
|
def get_room!(id), do: Repo.get!(Room, id)
|
|
|
|
def create_room(attrs) do
|
|
case %Room{} |> Room.changeset(attrs) |> Repo.insert() do
|
|
{:ok, room} ->
|
|
Phoenix.PubSub.broadcast(Localiser.PubSub, "rooms", {:room_created, room})
|
|
{:ok, room}
|
|
|
|
error ->
|
|
error
|
|
end
|
|
end
|
|
|
|
def update_room(%Room{} = room, attrs) do
|
|
case room |> Room.changeset(attrs) |> Repo.update() do
|
|
{:ok, room} ->
|
|
Phoenix.PubSub.broadcast(Localiser.PubSub, "rooms", {:room_updated, room})
|
|
{:ok, room}
|
|
|
|
error ->
|
|
error
|
|
end
|
|
end
|
|
|
|
def delete_room(%Room{} = room) do
|
|
sensors = Repo.all(from s in Sensor, where: s.room_id == ^room.id)
|
|
|
|
Enum.each(sensors, fn s ->
|
|
Sensors.remove_from_layout(s)
|
|
end)
|
|
|
|
case Repo.delete(room) do
|
|
{:ok, deleted} ->
|
|
Phoenix.PubSub.broadcast(Localiser.PubSub, "rooms", {:room_deleted, deleted.id, deleted.floor_id})
|
|
{:ok, deleted}
|
|
|
|
error ->
|
|
error
|
|
end
|
|
end
|
|
end
|