1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.ApiSpec.NotificationOperation do
6 alias OpenApiSpex.Operation
7 alias OpenApiSpex.Operation
8 alias OpenApiSpex.Schema
9 alias Pleroma.Web.ApiSpec.Schemas.Account
10 alias Pleroma.Web.ApiSpec.Schemas.ApiError
11 alias Pleroma.Web.ApiSpec.Schemas.BooleanLike
12 alias Pleroma.Web.ApiSpec.Schemas.Status
13 alias Pleroma.Web.ApiSpec.Schemas.VisibilityScope
15 import Pleroma.Web.ApiSpec.Helpers
17 def open_api_operation(action) do
18 operation = String.to_existing_atom("#{action}_operation")
19 apply(__MODULE__, operation, [])
22 def index_operation do
24 tags: ["Notifications"],
25 summary: "Retrieve a list of notifications",
27 "Notifications concerning the user. This API returns Link headers containing links to the next/previous page. However, the links can also be constructed dynamically using query params and `id` values.",
28 operationId: "NotificationController.index",
29 security: [%{"oAuth" => ["read:notifications"]}],
35 %Schema{type: :array, items: notification_type()},
36 "Array of types to exclude"
41 %Schema{type: :string},
42 "Return only notifications received from this account"
45 :exclude_visibilities,
47 %Schema{type: :array, items: VisibilityScope},
48 "Exclude the notifications for activities with the given visibilities"
53 %Schema{type: :array, items: notification_type()},
54 "Deprecated, use `types` instead"
59 %Schema{type: :array, items: notification_type()},
60 "Include the notifications for activities with the given types"
66 "Include the notifications from muted users"
68 ] ++ pagination_params(),
71 Operation.response("Array of notifications", "application/json", %Schema{
75 404 => Operation.response("Error", "application/json", ApiError)
82 tags: ["Notifications"],
83 summary: "Retrieve a notification",
84 description: "View information about a notification with a given ID.",
85 operationId: "NotificationController.show",
86 security: [%{"oAuth" => ["read:notifications"]}],
87 parameters: [id_param()],
89 200 => Operation.response("Notification", "application/json", notification())
94 def clear_operation do
96 tags: ["Notifications"],
97 summary: "Dismiss all notifications",
98 description: "Clear all notifications from the server.",
99 operationId: "NotificationController.clear",
100 security: [%{"oAuth" => ["write:notifications"]}],
101 responses: %{200 => empty_object_response()}
105 def dismiss_operation do
107 tags: ["Notifications"],
108 summary: "Dismiss a notification",
109 description: "Clear a single notification from the server.",
110 operationId: "NotificationController.dismiss",
111 parameters: [id_param()],
112 security: [%{"oAuth" => ["write:notifications"]}],
113 responses: %{200 => empty_object_response()}
117 def dismiss_via_body_operation do
119 tags: ["Notifications"],
120 summary: "Dismiss a single notification",
122 description: "Clear a single notification from the server.",
123 operationId: "NotificationController.dismiss_via_body",
127 %Schema{type: :object, properties: %{id: %Schema{type: :string}}},
130 security: [%{"oAuth" => ["write:notifications"]}],
131 responses: %{200 => empty_object_response()}
135 def destroy_multiple_operation do
137 tags: ["Notifications"],
138 summary: "Dismiss multiple notifications",
139 operationId: "NotificationController.destroy_multiple",
140 security: [%{"oAuth" => ["write:notifications"]}],
145 %Schema{type: :array, items: %Schema{type: :string}},
146 "Array of notification IDs to dismiss",
150 responses: %{200 => empty_object_response()}
156 title: "Notification",
157 description: "Response schema for a notification",
160 id: %Schema{type: :string},
161 type: notification_type(),
162 created_at: %Schema{type: :string, format: :"date-time"},
165 description: "The account that performed the action that generated the notification."
170 "Status that was the object of the notification, e.g. in mentions, reblogs, favourites, or polls.",
176 is_seen: %Schema{type: :boolean},
177 is_muted: %Schema{type: :boolean}
184 "created_at" => "2019-11-23T07:49:02.064Z",
185 "account" => Account.schema().example,
186 "status" => Status.schema().example,
187 "pleroma" => %{"is_seen" => false, "is_muted" => false}
192 defp notification_type do
200 "pleroma:emoji_reaction",
201 "pleroma:chat_mention",
208 The type of event that resulted in the notification.
210 - `follow` - Someone followed you
211 - `mention` - Someone mentioned you in their status
212 - `reblog` - Someone boosted one of your statuses
213 - `favourite` - Someone favourited one of your statuses
214 - `poll` - A poll you have voted in or created has ended
215 - `move` - Someone moved their account
216 - `pleroma:emoji_reaction` - Someone reacted with emoji to your status
217 - `pleroma:chat_mention` - Someone mentioned you in a chat message
218 - `pleroma:report` - Someone was reported
224 Operation.parameter(:id, :path, :string, "Notification ID",