Add `account_activation_required` to /api/v1/instance
[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 plug(Pleroma.Web.ApiSpec.CastAndValidate)
18 plug(OAuthScopesPlug, %{scopes: ["read:statuses"], admin: true} when action in [:index, :show])
19
20 plug(
21 OAuthScopesPlug,
22 %{scopes: ["write:statuses"], admin: true} when action in [:update, :delete]
23 )
24
25 action_fallback(Pleroma.Web.AdminAPI.FallbackController)
26
27 defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.StatusOperation
28
29 def index(%{assigns: %{user: _admin}} = conn, params) do
30 activities =
31 ActivityPub.fetch_statuses(nil, %{
32 "godmode" => params.godmode,
33 "local_only" => params.local_only,
34 "limit" => params.page_size,
35 "offset" => (params.page - 1) * params.page_size,
36 "exclude_reblogs" => not params.with_reblogs
37 })
38
39 render(conn, "index.json", activities: activities, as: :activity)
40 end
41
42 def show(conn, %{id: id}) do
43 with %Activity{} = activity <- Activity.get_by_id(id) do
44 conn
45 |> put_view(MastodonAPI.StatusView)
46 |> render("show.json", %{activity: activity})
47 else
48 nil -> {:error, :not_found}
49 end
50 end
51
52 def update(%{assigns: %{user: admin}, body_params: params} = conn, %{id: id}) do
53 with {:ok, activity} <- CommonAPI.update_activity_scope(id, params) do
54 ModerationLog.insert_log(%{
55 action: "status_update",
56 actor: admin,
57 subject: activity,
58 sensitive: params[:sensitive],
59 visibility: params[:visibility]
60 })
61
62 conn
63 |> put_view(MastodonAPI.StatusView)
64 |> render("show.json", %{activity: activity})
65 end
66 end
67
68 def delete(%{assigns: %{user: user}} = conn, %{id: id}) do
69 with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do
70 ModerationLog.insert_log(%{
71 action: "status_delete",
72 actor: user,
73 subject_id: id
74 })
75
76 json(conn, %{})
77 end
78 end
79 end