purge chat and shout endpoints
[akkoma] / lib / pleroma / web / admin_api / controllers / announcement_controller.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.AdminAPI.AnnouncementController do
6 use Pleroma.Web, :controller
7
8 alias Pleroma.Announcement
9 alias Pleroma.Web.ControllerHelper
10 alias Pleroma.Web.Plugs.OAuthScopesPlug
11
12 plug(Pleroma.Web.ApiSpec.CastAndValidate)
13 plug(OAuthScopesPlug, %{scopes: ["admin:write"]} when action in [:create, :delete, :change])
14 plug(OAuthScopesPlug, %{scopes: ["admin:read"]} when action in [:index, :show])
15 action_fallback(Pleroma.Web.AdminAPI.FallbackController)
16
17 defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.AnnouncementOperation
18
19 defp default_limit, do: 20
20
21 def index(conn, params) do
22 limit = Map.get(params, :limit, default_limit())
23 offset = Map.get(params, :offset, 0)
24
25 announcements = Announcement.list_paginated(%{limit: limit, offset: offset})
26
27 render(conn, "index.json", announcements: announcements)
28 end
29
30 def show(conn, %{id: id} = _params) do
31 announcement = Announcement.get_by_id(id)
32
33 if is_nil(announcement) do
34 {:error, :not_found}
35 else
36 render(conn, "show.json", announcement: announcement)
37 end
38 end
39
40 def create(%{body_params: params} = conn, _params) do
41 with {:ok, announcement} <- Announcement.add(change_params(params)) do
42 render(conn, "show.json", announcement: announcement)
43 else
44 _ ->
45 {:error, 400}
46 end
47 end
48
49 def change_params(orig_params) do
50 data =
51 %{}
52 |> Pleroma.Maps.put_if_present("content", orig_params, &Map.fetch(&1, :content))
53 |> Pleroma.Maps.put_if_present("all_day", orig_params, &Map.fetch(&1, :all_day))
54
55 orig_params
56 |> Map.merge(%{data: data})
57 end
58
59 def change(%{body_params: params} = conn, %{id: id} = _params) do
60 with announcement <- Announcement.get_by_id(id),
61 {:exists, true} <- {:exists, not is_nil(announcement)},
62 {:ok, announcement} <- Announcement.update(announcement, change_params(params)) do
63 render(conn, "show.json", announcement: announcement)
64 else
65 {:exists, false} ->
66 {:error, :not_found}
67
68 _ ->
69 {:error, 400}
70 end
71 end
72
73 def delete(conn, %{id: id} = _params) do
74 case Announcement.delete_by_id(id) do
75 :ok ->
76 conn
77 |> ControllerHelper.json_response(:ok, %{})
78
79 _ ->
80 {:error, :not_found}
81 end
82 end
83 end