2021-07-10 21:16:00 +00:00
|
|
|
defmodule MatrixServer.RoomServer do
|
|
|
|
use GenServer
|
|
|
|
|
2021-07-23 19:00:01 +00:00
|
|
|
alias MatrixServer.{Repo, Room, Event, Account}
|
2021-07-10 21:16:00 +00:00
|
|
|
alias MatrixServerWeb.API.CreateRoom
|
2021-07-17 15:38:20 +00:00
|
|
|
alias Ecto.Multi
|
2021-07-10 21:16:00 +00:00
|
|
|
|
2021-07-23 19:00:01 +00:00
|
|
|
@registry MatrixServer.RoomServer.Registry
|
|
|
|
@supervisor MatrixServer.RoomServer.Supervisor
|
|
|
|
|
|
|
|
def get_room_server(room_id) do
|
|
|
|
case Registry.lookup(@registry, room_id) do
|
|
|
|
[{pid, _}] ->
|
|
|
|
{:ok, pid}
|
|
|
|
|
|
|
|
[] ->
|
|
|
|
opts = [
|
|
|
|
room_id: room_id,
|
|
|
|
name: {:via, Registry, {@registry, room_id}}
|
|
|
|
]
|
|
|
|
|
|
|
|
DynamicSupervisor.start_child(@supervisor, {__MODULE__, opts})
|
|
|
|
end
|
2021-07-10 21:16:00 +00:00
|
|
|
end
|
|
|
|
|
2021-07-23 19:00:01 +00:00
|
|
|
def start_link(opts) do
|
|
|
|
{name, opts} = Keyword.pop(opts, :name)
|
|
|
|
GenServer.start_link(__MODULE__, opts, name: name)
|
2021-07-10 21:16:00 +00:00
|
|
|
end
|
|
|
|
|
2021-07-23 19:00:01 +00:00
|
|
|
def create_room(input, account) do
|
|
|
|
Multi.new()
|
|
|
|
|> Multi.insert(:room, Room.create_changeset(input))
|
|
|
|
|> Multi.run(:room_server, fn _repo, %{room: %Room{id: room_id} = room} ->
|
|
|
|
opts = [
|
|
|
|
name: {:via, Registry, {@registry, room_id}},
|
|
|
|
input: input,
|
|
|
|
account: account,
|
|
|
|
room: room
|
|
|
|
]
|
|
|
|
|
|
|
|
DynamicSupervisor.start_child(@supervisor, {__MODULE__, opts})
|
|
|
|
end)
|
|
|
|
|> Repo.transaction()
|
2021-07-10 21:16:00 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
@impl true
|
2021-07-23 19:00:01 +00:00
|
|
|
def init(opts) do
|
|
|
|
%Room{id: room_id} = Keyword.fetch!(opts, :room)
|
|
|
|
input = Keyword.fetch!(opts, :input)
|
|
|
|
account = Keyword.fetch!(opts, :account)
|
|
|
|
|
|
|
|
state = %{
|
|
|
|
room_id: room_id,
|
|
|
|
state_set: %{}
|
|
|
|
}
|
|
|
|
|
|
|
|
Repo.transaction(fn ->
|
|
|
|
with {:ok, create_room_event} <- insert_create_room_event(account, input, state) do
|
|
|
|
{:ok, state}
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
|
|
|
{:ok, state}
|
|
|
|
end
|
|
|
|
|
|
|
|
defp insert_create_room_event(
|
|
|
|
%Account{localpart: localpart},
|
|
|
|
%CreateRoom{room_version: room_version},
|
|
|
|
%{room_id: room_id, state_set: state_set}
|
|
|
|
) do
|
|
|
|
create_room_event = Event.create_room(room_id, MatrixServer.get_mxid(localpart), room_version)
|
|
|
|
MatrixServer.StateResolution.resolve(create_room_event)
|
|
|
|
{:ok, create_room_event}
|
2021-07-10 21:16:00 +00:00
|
|
|
end
|
|
|
|
end
|