First
[anni] / 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