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.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
23 plug(OAuthScopesPlug, %{scopes: ["read:reports"], admin: true} when action in [:index, :show])
27 %{scopes: ["write:reports"], admin: true}
28 when action in [:update, :notes_create, :notes_delete]
31 action_fallback(AdminAPI.FallbackController)
33 def index(conn, params) do
34 {page, page_size} = page_params(params)
36 reports = Utils.get_reports(params, page, page_size)
38 render(conn, "index.json", reports: reports)
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))
45 _ -> {:error, :not_found}
49 def update(%{assigns: %{user: admin}} = conn, %{"reports" => reports}) do
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",
62 {:error, message} -> %{id: report["id"], error: message}
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, "")
72 def notes_create(%{assigns: %{user: user}} = 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, %{
92 "report_id" => report_id
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, "")
108 defp page_params(params) do
109 {get_page(params["page"]), get_page_size(params["page_size"])}
112 defp get_page(page_string) when is_nil(page_string), do: 1
114 defp get_page(page_string) do
115 case Integer.parse(page_string) do
121 defp get_page_size(page_size_string) when is_nil(page_size_string), do: @users_page_size
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