Merge branch 'bugfix/mrf-ingestion' into 'develop'
[akkoma] / lib / pleroma / web / api_spec / operations / chat_operation.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
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
11
12 import Pleroma.Web.ApiSpec.Helpers
13
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, [])
18 end
19
20 def mark_as_read_operation do
21 %Operation{
22 tags: ["chat"],
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()),
27 responses: %{
28 200 =>
29 Operation.response(
30 "The updated chat",
31 "application/json",
32 Chat
33 )
34 },
35 security: [
36 %{
37 "oAuth" => ["write:chats"]
38 }
39 ]
40 }
41 end
42
43 def mark_message_as_read_operation do
44 %Operation{
45 tags: ["chat"],
46 summary: "Mark one message in the chat as read",
47 operationId: "ChatController.mark_message_as_read",
48 parameters: [
49 Operation.parameter(:id, :path, :string, "The ID of the Chat"),
50 Operation.parameter(:message_id, :path, :string, "The ID of the message")
51 ],
52 responses: %{
53 200 =>
54 Operation.response(
55 "The read ChatMessage",
56 "application/json",
57 ChatMessage
58 )
59 },
60 security: [
61 %{
62 "oAuth" => ["write:chats"]
63 }
64 ]
65 }
66 end
67
68 def show_operation do
69 %Operation{
70 tags: ["chat"],
71 summary: "Create a chat",
72 operationId: "ChatController.show",
73 parameters: [
74 Operation.parameter(
75 :id,
76 :path,
77 :string,
78 "The id of the chat",
79 required: true,
80 example: "1234"
81 )
82 ],
83 responses: %{
84 200 =>
85 Operation.response(
86 "The existing chat",
87 "application/json",
88 Chat
89 )
90 },
91 security: [
92 %{
93 "oAuth" => ["read"]
94 }
95 ]
96 }
97 end
98
99 def create_operation do
100 %Operation{
101 tags: ["chat"],
102 summary: "Create a chat",
103 operationId: "ChatController.create",
104 parameters: [
105 Operation.parameter(
106 :id,
107 :path,
108 :string,
109 "The account id of the recipient of this chat",
110 required: true,
111 example: "someflakeid"
112 )
113 ],
114 responses: %{
115 200 =>
116 Operation.response(
117 "The created or existing chat",
118 "application/json",
119 Chat
120 )
121 },
122 security: [
123 %{
124 "oAuth" => ["write:chats"]
125 }
126 ]
127 }
128 end
129
130 def index_operation do
131 %Operation{
132 tags: ["chat"],
133 summary: "Get a list of chats that you participated in",
134 operationId: "ChatController.index",
135 parameters: pagination_params(),
136 responses: %{
137 200 => Operation.response("The chats of the user", "application/json", chats_response())
138 },
139 security: [
140 %{
141 "oAuth" => ["read:chats"]
142 }
143 ]
144 }
145 end
146
147 def messages_operation do
148 %Operation{
149 tags: ["chat"],
150 summary: "Get the most recent messages of the chat",
151 operationId: "ChatController.messages",
152 parameters:
153 [Operation.parameter(:id, :path, :string, "The ID of the Chat")] ++
154 pagination_params(),
155 responses: %{
156 200 =>
157 Operation.response(
158 "The messages in the chat",
159 "application/json",
160 chat_messages_response()
161 )
162 },
163 security: [
164 %{
165 "oAuth" => ["read:chats"]
166 }
167 ]
168 }
169 end
170
171 def post_chat_message_operation do
172 %Operation{
173 tags: ["chat"],
174 summary: "Post a message to the chat",
175 operationId: "ChatController.post_chat_message",
176 parameters: [
177 Operation.parameter(:id, :path, :string, "The ID of the Chat")
178 ],
179 requestBody: request_body("Parameters", chat_message_create()),
180 responses: %{
181 200 =>
182 Operation.response(
183 "The newly created ChatMessage",
184 "application/json",
185 ChatMessage
186 ),
187 400 => Operation.response("Bad Request", "application/json", ApiError),
188 422 => Operation.response("MRF Rejection", "application/json", ApiError)
189 },
190 security: [
191 %{
192 "oAuth" => ["write:chats"]
193 }
194 ]
195 }
196 end
197
198 def delete_message_operation do
199 %Operation{
200 tags: ["chat"],
201 summary: "delete_message",
202 operationId: "ChatController.delete_message",
203 parameters: [
204 Operation.parameter(:id, :path, :string, "The ID of the Chat"),
205 Operation.parameter(:message_id, :path, :string, "The ID of the message")
206 ],
207 responses: %{
208 200 =>
209 Operation.response(
210 "The deleted ChatMessage",
211 "application/json",
212 ChatMessage
213 )
214 },
215 security: [
216 %{
217 "oAuth" => ["write:chats"]
218 }
219 ]
220 }
221 end
222
223 def chats_response do
224 %Schema{
225 title: "ChatsResponse",
226 description: "Response schema for multiple Chats",
227 type: :array,
228 items: Chat,
229 example: [
230 %{
231 "account" => %{
232 "pleroma" => %{
233 "is_admin" => false,
234 "confirmation_pending" => false,
235 "hide_followers_count" => false,
236 "is_moderator" => false,
237 "hide_favorites" => true,
238 "ap_id" => "https://dontbulling.me/users/lain",
239 "hide_follows_count" => false,
240 "hide_follows" => false,
241 "background_image" => nil,
242 "skip_thread_containment" => false,
243 "hide_followers" => false,
244 "relationship" => %{},
245 "tags" => []
246 },
247 "avatar" =>
248 "https://dontbulling.me/media/065a4dd3c6740dab13ff9c71ec7d240bb9f8be9205c9e7467fb2202117da1e32.jpg",
249 "following_count" => 0,
250 "header_static" => "https://originalpatchou.li/images/banner.png",
251 "source" => %{
252 "sensitive" => false,
253 "note" => "lain",
254 "pleroma" => %{
255 "discoverable" => false,
256 "actor_type" => "Person"
257 },
258 "fields" => []
259 },
260 "statuses_count" => 1,
261 "locked" => false,
262 "created_at" => "2020-04-16T13:40:15.000Z",
263 "display_name" => "lain",
264 "fields" => [],
265 "acct" => "lain@dontbulling.me",
266 "id" => "9u6Qw6TAZANpqokMkK",
267 "emojis" => [],
268 "avatar_static" =>
269 "https://dontbulling.me/media/065a4dd3c6740dab13ff9c71ec7d240bb9f8be9205c9e7467fb2202117da1e32.jpg",
270 "username" => "lain",
271 "followers_count" => 0,
272 "header" => "https://originalpatchou.li/images/banner.png",
273 "bot" => false,
274 "note" => "lain",
275 "url" => "https://dontbulling.me/users/lain"
276 },
277 "id" => "1",
278 "unread" => 2
279 }
280 ]
281 }
282 end
283
284 def chat_messages_response do
285 %Schema{
286 title: "ChatMessagesResponse",
287 description: "Response schema for multiple ChatMessages",
288 type: :array,
289 items: ChatMessage,
290 example: [
291 %{
292 "emojis" => [
293 %{
294 "static_url" => "https://dontbulling.me/emoji/Firefox.gif",
295 "visible_in_picker" => false,
296 "shortcode" => "firefox",
297 "url" => "https://dontbulling.me/emoji/Firefox.gif"
298 }
299 ],
300 "created_at" => "2020-04-21T15:11:46.000Z",
301 "content" => "Check this out :firefox:",
302 "id" => "13",
303 "chat_id" => "1",
304 "account_id" => "someflakeid",
305 "unread" => false
306 },
307 %{
308 "account_id" => "someflakeid",
309 "content" => "Whats' up?",
310 "id" => "12",
311 "chat_id" => "1",
312 "emojis" => [],
313 "created_at" => "2020-04-21T15:06:45.000Z",
314 "unread" => false
315 }
316 ]
317 }
318 end
319
320 def chat_message_create do
321 %Schema{
322 title: "ChatMessageCreateRequest",
323 description: "POST body for creating an chat message",
324 type: :object,
325 properties: %{
326 content: %Schema{
327 type: :string,
328 description: "The content of your message. Optional if media_id is present"
329 },
330 media_id: %Schema{type: :string, description: "The id of an upload"}
331 },
332 example: %{
333 "content" => "Hey wanna buy feet pics?",
334 "media_id" => "134234"
335 }
336 }
337 end
338
339 def mark_as_read do
340 %Schema{
341 title: "MarkAsReadRequest",
342 description: "POST body for marking a number of chat messages as read",
343 type: :object,
344 required: [:last_read_id],
345 properties: %{
346 last_read_id: %Schema{
347 type: :string,
348 description: "The content of your message."
349 }
350 },
351 example: %{
352 "last_read_id" => "abcdef12456"
353 }
354 }
355 end
356 end