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.ApiSpec.ChatOperation do
6 alias OpenApiSpex.Operation
7 alias OpenApiSpex.Schema
8 alias Pleroma.Web.ApiSpec.Schemas.ApiError
9 alias Pleroma.Web.ApiSpec.Schemas.Chat
10 alias Pleroma.Web.ApiSpec.Schemas.ChatMessage
12 import Pleroma.Web.ApiSpec.Helpers
14 @spec open_api_operation(atom) :: Operation.t()
15 def open_api_operation(action) do
16 operation = String.to_existing_atom("#{action}_operation")
17 apply(__MODULE__, operation, [])
20 def mark_as_read_operation do
23 summary: "Mark all messages in the chat as read",
24 operationId: "ChatController.mark_as_read",
25 parameters: [Operation.parameter(:id, :path, :string, "The ID of the Chat")],
26 requestBody: request_body("Parameters", mark_as_read()),
37 "oAuth" => ["write:chats"]
43 def mark_message_as_read_operation do
46 summary: "Mark one message in the chat as read",
47 operationId: "ChatController.mark_message_as_read",
49 Operation.parameter(:id, :path, :string, "The ID of the Chat"),
50 Operation.parameter(:message_id, :path, :string, "The ID of the message")
55 "The read ChatMessage",
62 "oAuth" => ["write:chats"]
71 summary: "Create a chat",
72 operationId: "ChatController.show",
99 def create_operation do
102 summary: "Create a chat",
103 operationId: "ChatController.create",
109 "The account id of the recipient of this chat",
111 example: "someflakeid"
117 "The created or existing chat",
124 "oAuth" => ["write:chats"]
130 def index_operation do
133 summary: "Get a list of chats that you participated in",
134 operationId: "ChatController.index",
135 parameters: pagination_params(),
137 200 => Operation.response("The chats of the user", "application/json", chats_response())
141 "oAuth" => ["read:chats"]
147 def messages_operation do
150 summary: "Get the most recent messages of the chat",
151 operationId: "ChatController.messages",
153 [Operation.parameter(:id, :path, :string, "The ID of the Chat")] ++
158 "The messages in the chat",
160 chat_messages_response()
162 404 => Operation.response("Not Found", "application/json", ApiError)
166 "oAuth" => ["read:chats"]
172 def post_chat_message_operation do
175 summary: "Post a message to the chat",
176 operationId: "ChatController.post_chat_message",
178 Operation.parameter(:id, :path, :string, "The ID of the Chat")
180 requestBody: request_body("Parameters", chat_message_create()),
184 "The newly created ChatMessage",
188 400 => Operation.response("Bad Request", "application/json", ApiError),
189 422 => Operation.response("MRF Rejection", "application/json", ApiError)
193 "oAuth" => ["write:chats"]
199 def delete_message_operation do
202 summary: "delete_message",
203 operationId: "ChatController.delete_message",
205 Operation.parameter(:id, :path, :string, "The ID of the Chat"),
206 Operation.parameter(:message_id, :path, :string, "The ID of the message")
211 "The deleted ChatMessage",
218 "oAuth" => ["write:chats"]
224 def chats_response do
226 title: "ChatsResponse",
227 description: "Response schema for multiple Chats",
235 "confirmation_pending" => false,
236 "hide_followers_count" => false,
237 "is_moderator" => false,
238 "hide_favorites" => true,
239 "ap_id" => "https://dontbulling.me/users/lain",
240 "hide_follows_count" => false,
241 "hide_follows" => false,
242 "background_image" => nil,
243 "skip_thread_containment" => false,
244 "hide_followers" => false,
245 "relationship" => %{},
249 "https://dontbulling.me/media/065a4dd3c6740dab13ff9c71ec7d240bb9f8be9205c9e7467fb2202117da1e32.jpg",
250 "following_count" => 0,
251 "header_static" => "https://originalpatchou.li/images/banner.png",
253 "sensitive" => false,
256 "discoverable" => false,
257 "actor_type" => "Person"
261 "statuses_count" => 1,
263 "created_at" => "2020-04-16T13:40:15.000Z",
264 "display_name" => "lain",
266 "acct" => "lain@dontbulling.me",
267 "id" => "9u6Qw6TAZANpqokMkK",
270 "https://dontbulling.me/media/065a4dd3c6740dab13ff9c71ec7d240bb9f8be9205c9e7467fb2202117da1e32.jpg",
271 "username" => "lain",
272 "followers_count" => 0,
273 "header" => "https://originalpatchou.li/images/banner.png",
276 "url" => "https://dontbulling.me/users/lain"
285 def chat_messages_response do
287 title: "ChatMessagesResponse",
288 description: "Response schema for multiple ChatMessages",
295 "static_url" => "https://dontbulling.me/emoji/Firefox.gif",
296 "visible_in_picker" => false,
297 "shortcode" => "firefox",
298 "url" => "https://dontbulling.me/emoji/Firefox.gif"
301 "created_at" => "2020-04-21T15:11:46.000Z",
302 "content" => "Check this out :firefox:",
305 "account_id" => "someflakeid",
309 "account_id" => "someflakeid",
310 "content" => "Whats' up?",
314 "created_at" => "2020-04-21T15:06:45.000Z",
321 def chat_message_create do
323 title: "ChatMessageCreateRequest",
324 description: "POST body for creating an chat message",
329 description: "The content of your message. Optional if media_id is present"
331 media_id: %Schema{type: :string, description: "The id of an upload"}
334 "content" => "Hey wanna buy feet pics?",
335 "media_id" => "134234"
342 title: "MarkAsReadRequest",
343 description: "POST body for marking a number of chat messages as read",
345 required: [:last_read_id],
347 last_read_id: %Schema{
349 description: "The content of your message."
353 "last_read_id" => "abcdef12456"