AdminAPI: list messages in a chat
[akkoma] / lib / pleroma / web / admin_api / controllers / chat_controller.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.AdminAPI.ChatController do
6 use Pleroma.Web, :controller
7
8 alias Pleroma.Activity
9 alias Pleroma.Chat
10 alias Pleroma.Chat.MessageReference
11 alias Pleroma.ModerationLog
12 alias Pleroma.Pagination
13 alias Pleroma.Plugs.OAuthScopesPlug
14 alias Pleroma.Web.CommonAPI
15 alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView
16
17 require Logger
18
19 plug(Pleroma.Web.ApiSpec.CastAndValidate)
20
21 plug(
22 OAuthScopesPlug,
23 %{scopes: ["read:chats"], admin: true} when action in [:messages]
24 )
25
26 plug(
27 OAuthScopesPlug,
28 %{scopes: ["write:chats"], admin: true} when action in [:delete_message]
29 )
30
31 action_fallback(Pleroma.Web.AdminAPI.FallbackController)
32
33 defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.ChatOperation
34
35 def delete_message(%{assigns: %{user: user}} = conn, %{message_id: id}) do
36 with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do
37 ModerationLog.insert_log(%{
38 action: "chat_message_delete",
39 actor: user,
40 subject_id: id
41 })
42
43 json(conn, %{})
44 end
45 end
46
47 def messages(conn, %{id: id} = params) do
48 with %Chat{} = chat <- Chat.get_by_id(id) do
49 cm_refs =
50 chat
51 |> MessageReference.for_chat_query()
52 |> Pagination.fetch_paginated(params)
53
54 conn
55 |> put_view(MessageReferenceView)
56 |> render("index.json", chat_message_references: cm_refs)
57 else
58 _ ->
59 conn
60 |> put_status(:not_found)
61 |> json(%{error: "not found"})
62 end
63 end
64 end