Changeset View
Changeset View
Standalone View
Standalone View
lib/kolab_chat/rooms.ex
- This file was added.
defmodule KolabChat.Rooms do | |||||
use GenServer | |||||
def get(roomId) do | |||||
GenServer.call(__MODULE__, {:get, roomId}) | |||||
end | |||||
def find(room) do | |||||
GenServer.call(__MODULE__, {:find, room}) | |||||
end | |||||
def set(roomId, room) do | |||||
GenServer.call(__MODULE__, {:set, roomId, room}) | |||||
end | |||||
def start_link do | |||||
:ets.new(:rooms, [:set, :named_table, :public]) | |||||
GenServer.start_link(__MODULE__, :ok, name: __MODULE__) | |||||
end | |||||
def handle_call({:get, roomId}, _from, state) do | |||||
room = | |||||
case lookup_rooms(roomId) do | |||||
nil -> nil | |||||
room -> Map.put(room, :id, roomId) | |||||
end | |||||
{:reply, room, state} | |||||
end | |||||
# Finding a room by any attribute value, supported: id, name | |||||
def handle_call({:find, room}, _from, state) do | |||||
has_id = Map.has_key?(room, :id) | |||||
room = | |||||
case has_id and lookup_rooms(room.id) do | |||||
# TODO: searching by name alias | |||||
nil -> nil | |||||
metadata -> Map.merge(room, metadata) | |||||
end | |||||
{:reply, room, state} | |||||
end | |||||
def handle_call({:set, roomId, metadata}, _from, state) do | |||||
metadata = lookup_rooms(roomId, %{}) | |||||
|> Map.merge(metadata) | |||||
|> Map.delete(:id) | |||||
:ets.insert(:rooms, {roomId, metadata}) | |||||
{:reply, :ok, state} | |||||
end | |||||
defp lookup_rooms(roomId, default \\ nil) do | |||||
case :ets.lookup(:rooms, roomId) do | |||||
[{_, room}] -> room | |||||
_ -> default | |||||
end | |||||
end | |||||
end |