2021-07-10 21:16:00 +00:00
|
|
|
defmodule MatrixServer.Room do
|
|
|
|
use Ecto.Schema
|
|
|
|
|
|
|
|
import Ecto.Changeset
|
2021-07-25 12:57:52 +00:00
|
|
|
import Ecto.Query
|
2021-07-10 21:16:00 +00:00
|
|
|
|
2021-07-25 12:57:52 +00:00
|
|
|
alias MatrixServer.{Repo, Room, Event}
|
2021-07-10 21:16:00 +00:00
|
|
|
alias MatrixServerWeb.API.CreateRoom
|
|
|
|
|
|
|
|
@primary_key {:id, :string, []}
|
|
|
|
schema "rooms" do
|
|
|
|
field :visibility, Ecto.Enum, values: [:public, :private]
|
2021-07-26 21:42:35 +00:00
|
|
|
field :state, :map
|
2021-07-25 12:57:52 +00:00
|
|
|
field :forward_extremities, {:array, :string}
|
2021-07-23 19:00:01 +00:00
|
|
|
has_many :events, Event, foreign_key: :event_id
|
2021-07-10 21:16:00 +00:00
|
|
|
end
|
|
|
|
|
2021-07-17 15:38:20 +00:00
|
|
|
def changeset(room, params \\ %{}) do
|
|
|
|
cast(room, params, [:visibility])
|
2021-07-10 21:16:00 +00:00
|
|
|
end
|
|
|
|
|
2021-07-17 15:38:20 +00:00
|
|
|
def create_changeset(%CreateRoom{} = input) do
|
|
|
|
visibility = input.visibility || :public
|
|
|
|
|
2021-07-26 21:42:35 +00:00
|
|
|
%Room{id: generate_room_id(), forward_extremities: [], state: %{}}
|
2021-07-17 15:38:20 +00:00
|
|
|
|> changeset(%{visibility: visibility})
|
2021-07-10 21:16:00 +00:00
|
|
|
end
|
|
|
|
|
2021-07-17 15:38:20 +00:00
|
|
|
def generate_room_id do
|
2021-07-26 17:47:38 +00:00
|
|
|
"!" <> MatrixServer.random_string(18) <> ":" <> MatrixServer.server_name()
|
2021-07-10 21:16:00 +00:00
|
|
|
end
|
2021-07-25 12:57:52 +00:00
|
|
|
|
2021-07-26 21:42:35 +00:00
|
|
|
def update_forward_extremities(
|
|
|
|
%Event{
|
|
|
|
event_id: event_id,
|
|
|
|
prev_events: prev_event_ids
|
|
|
|
},
|
|
|
|
%Room{id: room_id, forward_extremities: forward_extremities}
|
|
|
|
) do
|
2021-07-25 12:57:52 +00:00
|
|
|
new_forward_extremities = [event_id | forward_extremities -- prev_event_ids]
|
|
|
|
|
2021-07-26 21:42:35 +00:00
|
|
|
{_, [room]} =
|
2021-07-25 12:57:52 +00:00
|
|
|
from(r in Room, where: r.id == ^room_id, select: r)
|
|
|
|
|> Repo.update_all(set: [forward_extremities: new_forward_extremities])
|
|
|
|
|
|
|
|
room
|
|
|
|
end
|
2021-07-10 21:16:00 +00:00
|
|
|
end
|