Implement power_level_content_override for client room creation

This commit is contained in:
Pim Kunis 2021-09-11 15:11:38 +02:00
parent ee8c821653
commit 8ab147190e
3 changed files with 115 additions and 22 deletions

View file

@ -8,7 +8,25 @@ defmodule ArchitexWeb.Client.Request.CreateRoom do
topic: String.t() | nil,
invite: list(String.t()) | nil,
room_version: String.t() | nil,
preset: String.t() | nil
preset: String.t() | nil,
power_level_content_override: plco_t() | nil
}
@type plco_t :: %__MODULE__.PowerLevelContentOverride{
ban: integer() | nil,
events: %{optional(String.t()) => integer()} | nil,
events_default: integer() | nil,
invite: integer() | nil,
kick: integer() | nil,
redact: integer() | nil,
state_default: integer() | nil,
users: %{optional(String.t()) => integer()} | nil,
users_default: integer() | nil,
notifications: plco_n_t() | nil
}
@type plco_n_t :: %__MODULE__.PowerLevelContentOverride.Notifications{
room: integer() | nil
}
@primary_key false
@ -20,9 +38,25 @@ defmodule ArchitexWeb.Client.Request.CreateRoom do
field :invite, {:array, :string}
field :room_version, :string
field :preset, :string
embeds_one :power_level_content_override, PowerLevelContentOverride, primary_key: false do
field :ban, :integer
field :events, {:map, :integer}
field :events_default, :integer
field :invite, :integer
field :kick, :integer
field :redact, :integer
field :state_default, :integer
field :users, {:map, :integer}
field :users_default, :integer
embeds_one :notifications, Notifications, primary_key: false do
field :room, :integer
end
end
# TODO: unimplemented:
# creation_content, initial_state, invite_3pid, initial_state,
# is_direct, power_level_content_override
# creation_content, initial_state, invite_3pid, initial_state, is_direct
end
def changeset(data, params) do
@ -36,6 +70,33 @@ defmodule ArchitexWeb.Client.Request.CreateRoom do
:room_version,
:preset
])
|> cast_embed(:power_level_content_override,
with: &power_level_content_override_changeset/2,
required: false
)
|> validate_inclusion(:preset, ["private_chat", "public_chat", "trusted_private_chat"])
end
def power_level_content_override_changeset(data, params) do
data
|> cast(params, [
:ban,
:events,
:events_default,
:invite,
:kick,
:redact,
:state_default,
:users,
:users_default
])
|> cast_embed(:notifications,
with: &power_level_content_override_notifications_changeset/2,
required: false
)
end
def power_level_content_override_notifications_changeset(data, params) do
cast(data, params, [:room])
end
end