1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.AdminAPI.ReportController do
6 use Pleroma.Web, :controller
8 import Pleroma.Web.ControllerHelper, only: [json_response: 3]
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
21 plug(Pleroma.Web.ApiSpec.CastAndValidate)
22 plug(OAuthScopesPlug, %{scopes: ["read:reports"], admin: true} when action in [:index, :show])
26 %{scopes: ["write:reports"], admin: true}
27 when action in [:update, :notes_create, :notes_delete]
30 action_fallback(AdminAPI.FallbackController)
32 defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.ReportOperation
34 def index(conn, params) do
35 reports = Utils.get_reports(params, params.page, params.page_size)
37 render(conn, "index.json", reports: reports)
40 def show(conn, %{id: id}) do
41 with %Activity{} = report <- Activity.get_report(id) do
42 render(conn, "show.json", Report.extract_report_info(report))
44 _ -> {:error, :not_found}
48 def update(%{assigns: %{user: admin}, body_params: %{reports: reports}} = conn, _) do
50 Enum.map(reports, fn report ->
51 case CommonAPI.update_report_state(report.id, report.state) do
53 ModerationLog.insert_log(%{
54 action: "report_update",
62 %{id: report.id, error: message}
66 if Enum.any?(result, &Map.has_key?(&1, :error)) do
67 json_response(conn, :bad_request, result)
69 json_response(conn, :no_content, "")
73 def notes_create(%{assigns: %{user: user}, body_params: %{content: content}} = conn, %{
76 with {:ok, _} <- ReportNote.create(user.id, report_id, content) do
77 ModerationLog.insert_log(%{
78 action: "report_note",
80 subject: Activity.get_by_id(report_id),
84 json_response(conn, :no_content, "")
86 _ -> json_response(conn, :bad_request, "")
90 def notes_delete(%{assigns: %{user: user}} = conn, %{
94 with {:ok, note} <- ReportNote.destroy(note_id) do
95 ModerationLog.insert_log(%{
96 action: "report_note_delete",
98 subject: Activity.get_by_id(report_id),
102 json_response(conn, :no_content, "")
104 _ -> json_response(conn, :bad_request, "")