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.StatusController do
6 use Pleroma.Web, :controller
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
19 plug(OAuthScopesPlug, %{scopes: ["read:statuses"], admin: true} when action in [:index, :show])
23 %{scopes: ["write:statuses"], admin: true} when action in [:update, :delete]
26 action_fallback(Pleroma.Web.AdminAPI.FallbackController)
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)
35 ActivityPub.fetch_statuses(nil, %{
37 "local_only" => local_only,
39 "offset" => (page - 1) * page_size,
40 "exclude_reblogs" => !with_reblogs && "true"
43 render(conn, "index.json", %{activities: activities, as: :activity})
46 def show(conn, %{"id" => id}) do
47 with %Activity{} = activity <- Activity.get_by_id(id) do
49 |> put_view(MastodonAPI.StatusView)
50 |> render("show.json", %{activity: activity})
52 nil -> {:error, :not_found}
56 def update(%{assigns: %{user: admin}} = conn, %{"id" => id} = params) do
59 |> Map.take(["sensitive", "visibility"])
60 |> Map.new(fn {key, value} -> {String.to_existing_atom(key), value} end)
62 with {:ok, activity} <- CommonAPI.update_activity_scope(id, params) do
63 {:ok, sensitive} = Ecto.Type.cast(:boolean, params[:sensitive])
65 ModerationLog.insert_log(%{
66 action: "status_update",
70 visibility: params[:visibility]
74 |> put_view(MastodonAPI.StatusView)
75 |> render("show.json", %{activity: activity})
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",
91 defp page_params(params) do
92 {get_page(params["page"]), get_page_size(params["page_size"])}
95 defp get_page(page_string) when is_nil(page_string), do: 1
97 defp get_page(page_string) do
98 case Integer.parse(page_string) do
104 defp get_page_size(page_size_string) when is_nil(page_size_string), do: @users_page_size
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