Implement get/set visibility client endpoints
This commit is contained in:
parent
2088f0a869
commit
de950fc769
3 changed files with 91 additions and 3 deletions
|
@ -146,6 +146,14 @@ defmodule MatrixServer.RoomServer do
|
|||
GenServer.call(pid, {:unban, account, user_id})
|
||||
end
|
||||
|
||||
@doc """
|
||||
Attempt to set the room's visibility.
|
||||
"""
|
||||
@spec set_visibility(pid(), Account.t(), atom()) :: :ok | {:error, atom()}
|
||||
def set_visibility(pid, account, visibility) do
|
||||
GenServer.call(pid, {:set_visibility, account, visibility})
|
||||
end
|
||||
|
||||
### Implementation
|
||||
|
||||
@impl true
|
||||
|
@ -306,6 +314,26 @@ defmodule MatrixServer.RoomServer do
|
|||
end
|
||||
end
|
||||
|
||||
def handle_call(
|
||||
{:set_visibility, account, visibility},
|
||||
_from,
|
||||
%{room: room, state_set: state_set} = state
|
||||
) do
|
||||
case state_set do
|
||||
%{{"m.room.create", ""} => %Event{content: %{"creator" => creator}}} ->
|
||||
if creator == Account.get_mxid(account) do
|
||||
room = Repo.update!(change(room, visibility: visibility))
|
||||
|
||||
{:reply, :ok, %{state | room: room}}
|
||||
else
|
||||
{:reply, {:error, :unauthorized}, state}
|
||||
end
|
||||
|
||||
_ ->
|
||||
{:reply, {:error, :unknown}, state}
|
||||
end
|
||||
end
|
||||
|
||||
@spec insert_single_event(Room.t(), t(), Event.t()) :: {:ok, {t(), Room.t()}} | {:error, atom()}
|
||||
defp insert_single_event(room, state_set, event) do
|
||||
Repo.transaction(fn ->
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
defmodule MatrixServerWeb.Client.RoomDirectoryController do
|
||||
use MatrixServerWeb, :controller
|
||||
|
||||
import MatrixServerWeb.Error
|
||||
import Ecto.Query
|
||||
|
||||
alias MatrixServer.{Repo, Room, RoomServer}
|
||||
alias Plug.Conn
|
||||
|
||||
@doc """
|
||||
Gets the visibility of a given room on the server's public room directory.
|
||||
|
||||
Action for GET /_matrix/client/r0/directory/list/room/{roomId}.
|
||||
"""
|
||||
def get_visibility(conn, %{"room_id" => room_id}) do
|
||||
case Repo.one(from r in Room, where: r.id == ^room_id) do
|
||||
%Room{visibility: visibility} ->
|
||||
conn
|
||||
|> put_status(200)
|
||||
|> json(%{visibility: visibility})
|
||||
|
||||
nil ->
|
||||
put_error(conn, :not_found, "The room was not found.")
|
||||
end
|
||||
end
|
||||
|
||||
@doc """
|
||||
Sets the visibility of a given room in the server's public room directory.
|
||||
|
||||
Only allow the creator of the room to change visibility.
|
||||
Action for PUT /_matrix/client/r0/directory/list/room/{roomId}.
|
||||
"""
|
||||
def set_visibility(%Conn{assigns: %{account: account}} = conn, %{"room_id" => room_id} = params) do
|
||||
visibility = Map.get(params, "visibility", "public")
|
||||
|
||||
if visibility in ["public", "private"] do
|
||||
visibility = String.to_atom(visibility)
|
||||
|
||||
with {:ok, pid} <- RoomServer.get_room_server(room_id),
|
||||
:ok <- RoomServer.set_visibility(pid, account, visibility) do
|
||||
conn
|
||||
|> send_resp(200, [])
|
||||
|> halt()
|
||||
else
|
||||
{:error, :not_found} ->
|
||||
put_error(conn, :not_found, "The given room was not found.")
|
||||
|
||||
{:error, :unauthorized} ->
|
||||
put_error(conn, :unauthorized, "Only the room's creator can change visibility.")
|
||||
|
||||
{:error, _} ->
|
||||
put_error(conn, :unknown)
|
||||
end
|
||||
else
|
||||
put_error(conn, :invalid_param, "Invalid visibility.")
|
||||
end
|
||||
end
|
||||
end
|
|
@ -30,6 +30,7 @@ defmodule MatrixServerWeb.Router do
|
|||
get "/register/available", AccountController, :available
|
||||
get "/login", LoginController, :login_types
|
||||
post "/login", LoginController, :login
|
||||
get "/directory/list/room/:room_id", RoomDirectoryController, :get_visibility
|
||||
end
|
||||
|
||||
get "/versions", InfoController, :versions
|
||||
|
@ -53,8 +54,9 @@ defmodule MatrixServerWeb.Router do
|
|||
post "/createRoom", RoomController, :create
|
||||
get "/joined_rooms", RoomController, :joined_rooms
|
||||
|
||||
scope "/directory/room" do
|
||||
put "/:alias", AliasesController, :create
|
||||
scope "/directory" do
|
||||
put "/room/:alias", AliasesController, :create
|
||||
put "/list/room/:room_id", RoomDirectoryController, :set_visibility
|
||||
end
|
||||
|
||||
scope "/rooms/:room_id" do
|
||||
|
|
Loading…
Reference in a new issue