defmodule Localiser.Domain.Rooms do import Ecto.Query alias Localiser.Repo alias Localiser.Domain.Schema.Room alias Localiser.Domain.Schema.Sensor def list_rooms do Repo.all(Room) end 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) case Repo.delete(room) do {:ok, deleted} -> Enum.each(sensors, fn s -> Phoenix.PubSub.broadcast(Localiser.PubSub, "sensors", {:sensor_unenrolled, s.sensor_id}) end) Phoenix.PubSub.broadcast(Localiser.PubSub, "rooms", {:room_deleted, deleted.id, deleted.floor_id}) {:ok, deleted} error -> error end end end