Move status actions to AdminAPI.StatusController
[akkoma] / lib / pleroma / web / admin_api / controllers / status_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.StatusController do
6 use Pleroma.Web, :controller
7
8 alias Pleroma.Activity
9 alias Pleroma.ModerationLog
10 alias Pleroma.Plugs.OAuthScopesPlug
11 alias Pleroma.Web.ActivityPub.ActivityPub
12 alias Pleroma.Web.CommonAPI
13 alias Pleroma.Web.MastodonAPI
14
15 require Logger
16
17 @users_page_size 50
18
19 plug(OAuthScopesPlug, %{scopes: ["read:statuses"], admin: true} when action in [:index, :show])
20
21 plug(
22 OAuthScopesPlug,
23 %{scopes: ["write:statuses"], admin: true} when action in [:update, :delete]
24 )
25
26 action_fallback(Pleroma.Web.AdminAPI.FallbackController)
27
28 def index(%{assigns: %{user: _admin}} = conn, params) do
29 godmode = params["godmode"] == "true" || params["godmode"] == true
30 local_only = params["local_only"] == "true" || params["local_only"] == true
31 with_reblogs = params["with_reblogs"] == "true" || params["with_reblogs"] == true
32 {page, page_size} = page_params(params)
33
34 activities =
35 ActivityPub.fetch_statuses(nil, %{
36 "godmode" => godmode,
37 "local_only" => local_only,
38 "limit" => page_size,
39 "offset" => (page - 1) * page_size,
40 "exclude_reblogs" => !with_reblogs && "true"
41 })
42
43 render(conn, "index.json", %{activities: activities, as: :activity})
44 end
45
46 def show(conn, %{"id" => id}) do
47 with %Activity{} = activity <- Activity.get_by_id(id) do
48 conn
49 |> put_view(MastodonAPI.StatusView)
50 |> render("show.json", %{activity: activity})
51 else
52 nil -> {:error, :not_found}
53 end
54 end
55
56 def update(%{assigns: %{user: admin}} = conn, %{"id" => id} = params) do
57 params =
58 params
59 |> Map.take(["sensitive", "visibility"])
60 |> Map.new(fn {key, value} -> {String.to_existing_atom(key), value} end)
61
62 with {:ok, activity} <- CommonAPI.update_activity_scope(id, params) do
63 {:ok, sensitive} = Ecto.Type.cast(:boolean, params[:sensitive])
64
65 ModerationLog.insert_log(%{
66 action: "status_update",
67 actor: admin,
68 subject: activity,
69 sensitive: sensitive,
70 visibility: params[:visibility]
71 })
72
73 conn
74 |> put_view(MastodonAPI.StatusView)
75 |> render("show.json", %{activity: activity})
76 end
77 end
78
79 def delete(%{assigns: %{user: user}} = conn, %{"id" => id}) do
80 with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do
81 ModerationLog.insert_log(%{
82 action: "status_delete",
83 actor: user,
84 subject_id: id
85 })
86
87 json(conn, %{})
88 end
89 end
90
91 defp page_params(params) do
92 {get_page(params["page"]), get_page_size(params["page_size"])}
93 end
94
95 defp get_page(page_string) when is_nil(page_string), do: 1
96
97 defp get_page(page_string) do
98 case Integer.parse(page_string) do
99 {page, _} -> page
100 :error -> 1
101 end
102 end
103
104 defp get_page_size(page_size_string) when is_nil(page_size_string), do: @users_page_size
105
106 defp get_page_size(page_size_string) do
107 case Integer.parse(page_size_string) do
108 {page_size, _} -> page_size
109 :error -> @users_page_size
110 end
111 end
112 end