aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/web/api_spec/operations/admin/announcement_operation.ex
blob: 58a039e721eb30a3a83976841d065e3567c6eefa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.ApiSpec.Admin.AnnouncementOperation do
  alias OpenApiSpex.Operation
  alias OpenApiSpex.Schema
  alias Pleroma.Web.ApiSpec.Schemas.Announcement
  alias Pleroma.Web.ApiSpec.Schemas.ApiError

  import Pleroma.Web.ApiSpec.Helpers

  def open_api_operation(action) do
    operation = String.to_existing_atom("#{action}_operation")
    apply(__MODULE__, operation, [])
  end

  def index_operation do
    %Operation{
      tags: ["Announcement managment"],
      summary: "Retrieve a list of announcements",
      operationId: "AdminAPI.AnnouncementController.index",
      security: [%{"oAuth" => ["admin:read"]}],
      parameters: [
        Operation.parameter(
          :limit,
          :query,
          %Schema{type: :integer, minimum: 1},
          "the maximum number of announcements to return"
        ),
        Operation.parameter(
          :offset,
          :query,
          %Schema{type: :integer, minimum: 0},
          "the offset of the first announcement to return"
        )
        | admin_api_params()
      ],
      responses: %{
        200 => Operation.response("Response", "application/json", list_of_announcements()),
        400 => Operation.response("Forbidden", "application/json", ApiError),
        403 => Operation.response("Forbidden", "application/json", ApiError)
      }
    }
  end

  def show_operation do
    %Operation{
      tags: ["Announcement managment"],
      summary: "Display one announcement",
      operationId: "AdminAPI.AnnouncementController.show",
      security: [%{"oAuth" => ["admin:read"]}],
      parameters: [
        Operation.parameter(
          :id,
          :path,
          :string,
          "announcement id"
        )
        | admin_api_params()
      ],
      responses: %{
        200 => Operation.response("Response", "application/json", Announcement),
        403 => Operation.response("Forbidden", "application/json", ApiError),
        404 => Operation.response("Not Found", "application/json", ApiError)
      }
    }
  end

  def delete_operation do
    %Operation{
      tags: ["Announcement managment"],
      summary: "Delete one announcement",
      operationId: "AdminAPI.AnnouncementController.delete",
      security: [%{"oAuth" => ["admin:write"]}],
      parameters: [
        Operation.parameter(
          :id,
          :path,
          :string,
          "announcement id"
        )
        | admin_api_params()
      ],
      responses: %{
        200 => Operation.response("Response", "application/json", %Schema{type: :object}),
        403 => Operation.response("Forbidden", "application/json", ApiError),
        404 => Operation.response("Not Found", "application/json", ApiError)
      }
    }
  end

  def create_operation do
    %Operation{
      tags: ["Announcement managment"],
      summary: "Create one announcement",
      operationId: "AdminAPI.AnnouncementController.create",
      security: [%{"oAuth" => ["admin:write"]}],
      requestBody: request_body("Parameters", create_request(), required: true),
      responses: %{
        200 => Operation.response("Response", "application/json", Announcement),
        400 => Operation.response("Bad Request", "application/json", ApiError),
        403 => Operation.response("Forbidden", "application/json", ApiError)
      }
    }
  end

  def change_operation do
    %Operation{
      tags: ["Announcement managment"],
      summary: "Change one announcement",
      operationId: "AdminAPI.AnnouncementController.change",
      security: [%{"oAuth" => ["admin:write"]}],
      parameters: [
        Operation.parameter(
          :id,
          :path,
          :string,
          "announcement id"
        )
        | admin_api_params()
      ],
      requestBody: request_body("Parameters", change_request(), required: true),
      responses: %{
        200 => Operation.response("Response", "application/json", Announcement),
        400 => Operation.response("Bad Request", "application/json", ApiError),
        403 => Operation.response("Forbidden", "application/json", ApiError),
        404 => Operation.response("Not Found", "application/json", ApiError)
      }
    }
  end

  defp create_or_change_props do
    %{
      content: %Schema{type: :string},
      starts_at: %Schema{type: :string, format: "date-time", nullable: true},
      ends_at: %Schema{type: :string, format: "date-time", nullable: true},
      all_day: %Schema{type: :boolean}
    }
  end

  def create_request do
    %Schema{
      title: "AnnouncementCreateRequest",
      type: :object,
      required: [:content],
      properties: create_or_change_props()
    }
  end

  def change_request do
    %Schema{
      title: "AnnouncementChangeRequest",
      type: :object,
      properties: create_or_change_props()
    }
  end

  def list_of_announcements do
    %Schema{
      type: :array,
      items: Announcement
    }
  end
end