Move report actions to AdminAPI.ReportController
[akkoma] / lib / pleroma / web / admin_api / controllers / report_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.ReportController do
6 use Pleroma.Web, :controller
7
8 import Pleroma.Web.ControllerHelper, only: [json_response: 3]
9
10 alias Pleroma.Activity
11 alias Pleroma.ModerationLog
12 alias Pleroma.Plugs.OAuthScopesPlug
13 alias Pleroma.ReportNote
14 alias Pleroma.Web.ActivityPub.Utils
15 alias Pleroma.Web.AdminAPI
16 alias Pleroma.Web.AdminAPI.Report
17 alias Pleroma.Web.CommonAPI
18
19 require Logger
20
21 @users_page_size 50
22
23 plug(OAuthScopesPlug, %{scopes: ["read:reports"], admin: true} when action in [:index, :show])
24
25 plug(
26 OAuthScopesPlug,
27 %{scopes: ["write:reports"], admin: true}
28 when action in [:update, :notes_create, :notes_delete]
29 )
30
31 action_fallback(AdminAPI.FallbackController)
32
33 def index(conn, params) do
34 {page, page_size} = page_params(params)
35
36 reports = Utils.get_reports(params, page, page_size)
37
38 render(conn, "index.json", reports: reports)
39 end
40
41 def show(conn, %{"id" => id}) do
42 with %Activity{} = report <- Activity.get_by_id(id) do
43 render(conn, "show.json", Report.extract_report_info(report))
44 else
45 _ -> {:error, :not_found}
46 end
47 end
48
49 def update(%{assigns: %{user: admin}} = conn, %{"reports" => reports}) do
50 result =
51 reports
52 |> Enum.map(fn report ->
53 with {:ok, activity} <- CommonAPI.update_report_state(report["id"], report["state"]) do
54 ModerationLog.insert_log(%{
55 action: "report_update",
56 actor: admin,
57 subject: activity
58 })
59
60 activity
61 else
62 {:error, message} -> %{id: report["id"], error: message}
63 end
64 end)
65
66 case Enum.any?(result, &Map.has_key?(&1, :error)) do
67 true -> json_response(conn, :bad_request, result)
68 false -> json_response(conn, :no_content, "")
69 end
70 end
71
72 def notes_create(%{assigns: %{user: user}} = conn, %{
73 "id" => report_id,
74 "content" => content
75 }) do
76 with {:ok, _} <- ReportNote.create(user.id, report_id, content) do
77 ModerationLog.insert_log(%{
78 action: "report_note",
79 actor: user,
80 subject: Activity.get_by_id(report_id),
81 text: content
82 })
83
84 json_response(conn, :no_content, "")
85 else
86 _ -> json_response(conn, :bad_request, "")
87 end
88 end
89
90 def notes_delete(%{assigns: %{user: user}} = conn, %{
91 "id" => note_id,
92 "report_id" => report_id
93 }) do
94 with {:ok, note} <- ReportNote.destroy(note_id) do
95 ModerationLog.insert_log(%{
96 action: "report_note_delete",
97 actor: user,
98 subject: Activity.get_by_id(report_id),
99 text: note.content
100 })
101
102 json_response(conn, :no_content, "")
103 else
104 _ -> json_response(conn, :bad_request, "")
105 end
106 end
107
108 defp page_params(params) do
109 {get_page(params["page"]), get_page_size(params["page_size"])}
110 end
111
112 defp get_page(page_string) when is_nil(page_string), do: 1
113
114 defp get_page(page_string) do
115 case Integer.parse(page_string) do
116 {page, _} -> page
117 :error -> 1
118 end
119 end
120
121 defp get_page_size(page_size_string) when is_nil(page_size_string), do: @users_page_size
122
123 defp get_page_size(page_size_string) do
124 case Integer.parse(page_size_string) do
125 {page_size, _} -> page_size
126 :error -> @users_page_size
127 end
128 end
129 end