Merge branch 'develop' into refactor/discoverable_user_field
[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.ReportNote
13 alias Pleroma.Web.ActivityPub.Utils
14 alias Pleroma.Web.AdminAPI
15 alias Pleroma.Web.AdminAPI.Report
16 alias Pleroma.Web.CommonAPI
17 alias Pleroma.Web.Plugs.OAuthScopesPlug
18
19 require Logger
20
21 plug(Pleroma.Web.ApiSpec.CastAndValidate)
22 plug(OAuthScopesPlug, %{scopes: ["read:reports"], admin: true} when action in [:index, :show])
23
24 plug(
25 OAuthScopesPlug,
26 %{scopes: ["write:reports"], admin: true}
27 when action in [:update, :notes_create, :notes_delete]
28 )
29
30 action_fallback(AdminAPI.FallbackController)
31
32 defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.ReportOperation
33
34 def index(conn, params) do
35 reports = Utils.get_reports(params, params.page, params.page_size)
36
37 render(conn, "index.json", reports: reports)
38 end
39
40 def show(conn, %{id: id}) do
41 with %Activity{} = report <- Activity.get_by_id(id) do
42 render(conn, "show.json", Report.extract_report_info(report))
43 else
44 _ -> {:error, :not_found}
45 end
46 end
47
48 def update(%{assigns: %{user: admin}, body_params: %{reports: reports}} = conn, _) do
49 result =
50 Enum.map(reports, fn report ->
51 case CommonAPI.update_report_state(report.id, report.state) do
52 {:ok, activity} ->
53 ModerationLog.insert_log(%{
54 action: "report_update",
55 actor: admin,
56 subject: activity
57 })
58
59 activity
60
61 {:error, message} ->
62 %{id: report.id, error: message}
63 end
64 end)
65
66 if Enum.any?(result, &Map.has_key?(&1, :error)) do
67 json_response(conn, :bad_request, result)
68 else
69 json_response(conn, :no_content, "")
70 end
71 end
72
73 def notes_create(%{assigns: %{user: user}, body_params: %{content: content}} = conn, %{
74 id: report_id
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 end