2021-07-10 21:16:00 +00:00
|
|
|
defmodule MatrixServer.RoomServer do
|
|
|
|
use GenServer
|
|
|
|
|
2021-07-17 15:38:20 +00:00
|
|
|
alias MatrixServer.{Repo, Room, Event}
|
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
|
|
|
|
|
|
|
def start_link(_opts) do
|
|
|
|
GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
|
|
|
|
end
|
|
|
|
|
2021-07-17 15:38:20 +00:00
|
|
|
def create_room(%CreateRoom{} = input, account) do
|
|
|
|
GenServer.call(__MODULE__, {:create_room, input, account})
|
2021-07-10 21:16:00 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
@impl true
|
|
|
|
def init(:ok) do
|
|
|
|
{:ok, %{}}
|
|
|
|
end
|
|
|
|
|
|
|
|
@impl true
|
2021-07-17 15:38:20 +00:00
|
|
|
def handle_call({:create_room, input, account}, _from, state) do
|
|
|
|
# TODO: preset events, initial_state events, invite, invite_3pid
|
|
|
|
result =
|
|
|
|
Multi.new()
|
2021-07-17 16:54:49 +00:00
|
|
|
|> Multi.put(:input, input)
|
|
|
|
|> Multi.put(:account, account)
|
2021-07-17 15:38:20 +00:00
|
|
|
|> Multi.insert(:room, Room.create_changeset(input))
|
2021-07-17 16:54:49 +00:00
|
|
|
|> Multi.run(:create_room_event, &Event.room_creation_create_room/2)
|
|
|
|
|> Multi.run(:join_creator_event, &Event.room_creation_join_creator/2)
|
|
|
|
|> Multi.run(:power_levels_event, &Event.room_creation_power_levels/2)
|
|
|
|
|> Multi.run(:name_event, &Event.room_creation_name/2)
|
|
|
|
|> Multi.run(:topic_event, &Event.room_creation_topic/2)
|
2021-07-21 13:50:28 +00:00
|
|
|
|> Multi.run(:temp, fn _, _ ->
|
|
|
|
{:error, :lol}
|
|
|
|
end)
|
2021-07-17 15:38:20 +00:00
|
|
|
|> Repo.transaction()
|
2021-07-10 21:16:00 +00:00
|
|
|
|
2021-07-17 15:38:20 +00:00
|
|
|
{:reply, result, state}
|
2021-07-10 21:16:00 +00:00
|
|
|
end
|
|
|
|
end
|