b1a0d26ab6e51f3315db9e7508c19717c6b91eef
[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 },
189 security: [
190 %{
191 "oAuth" => ["write:chats"]
192 }
193 ]
194 }
195 end
196
197 def delete_message_operation do
198 %Operation{
199 tags: ["chat"],
200 summary: "delete_message",
201 operationId: "ChatController.delete_message",
202 parameters: [
203 Operation.parameter(:id, :path, :string, "The ID of the Chat"),
204 Operation.parameter(:message_id, :path, :string, "The ID of the message")
205 ],
206 responses: %{
207 200 =>
208 Operation.response(
209 "The deleted ChatMessage",
210 "application/json",
211 ChatMessage
212 )
213 },
214 security: [
215 %{
216 "oAuth" => ["write:chats"]
217 }
218 ]
219 }
220 end
221
222 def chats_response do
223 %Schema{
224 title: "ChatsResponse",
225 description: "Response schema for multiple Chats",
226 type: :array,
227 items: Chat,
228 example: [
229 %{
230 "account" => %{
231 "pleroma" => %{
232 "is_admin" => false,
233 "confirmation_pending" => false,
234 "hide_followers_count" => false,
235 "is_moderator" => false,
236 "hide_favorites" => true,
237 "ap_id" => "https://dontbulling.me/users/lain",
238 "hide_follows_count" => false,
239 "hide_follows" => false,
240 "background_image" => nil,
241 "skip_thread_containment" => false,
242 "hide_followers" => false,
243 "relationship" => %{},
244 "tags" => []
245 },
246 "avatar" =>
247 "https://dontbulling.me/media/065a4dd3c6740dab13ff9c71ec7d240bb9f8be9205c9e7467fb2202117da1e32.jpg",
248 "following_count" => 0,
249 "header_static" => "https://originalpatchou.li/images/banner.png",
250 "source" => %{
251 "sensitive" => false,
252 "note" => "lain",
253 "pleroma" => %{
254 "discoverable" => false,
255 "actor_type" => "Person"
256 },
257 "fields" => []
258 },
259 "statuses_count" => 1,
260 "locked" => false,
261 "created_at" => "2020-04-16T13:40:15.000Z",
262 "display_name" => "lain",
263 "fields" => [],
264 "acct" => "lain@dontbulling.me",
265 "id" => "9u6Qw6TAZANpqokMkK",
266 "emojis" => [],
267 "avatar_static" =>
268 "https://dontbulling.me/media/065a4dd3c6740dab13ff9c71ec7d240bb9f8be9205c9e7467fb2202117da1e32.jpg",
269 "username" => "lain",
270 "followers_count" => 0,
271 "header" => "https://originalpatchou.li/images/banner.png",
272 "bot" => false,
273 "note" => "lain",
274 "url" => "https://dontbulling.me/users/lain"
275 },
276 "id" => "1",
277 "unread" => 2
278 }
279 ]
280 }
281 end
282
283 def chat_messages_response do
284 %Schema{
285 title: "ChatMessagesResponse",
286 description: "Response schema for multiple ChatMessages",
287 type: :array,
288 items: ChatMessage,
289 example: [
290 %{
291 "emojis" => [
292 %{
293 "static_url" => "https://dontbulling.me/emoji/Firefox.gif",
294 "visible_in_picker" => false,
295 "shortcode" => "firefox",
296 "url" => "https://dontbulling.me/emoji/Firefox.gif"
297 }
298 ],
299 "created_at" => "2020-04-21T15:11:46.000Z",
300 "content" => "Check this out :firefox:",
301 "id" => "13",
302 "chat_id" => "1",
303 "account_id" => "someflakeid",
304 "unread" => false
305 },
306 %{
307 "account_id" => "someflakeid",
308 "content" => "Whats' up?",
309 "id" => "12",
310 "chat_id" => "1",
311 "emojis" => [],
312 "created_at" => "2020-04-21T15:06:45.000Z",
313 "unread" => false
314 }
315 ]
316 }
317 end
318
319 def chat_message_create do
320 %Schema{
321 title: "ChatMessageCreateRequest",
322 description: "POST body for creating an chat message",
323 type: :object,
324 properties: %{
325 content: %Schema{
326 type: :string,
327 description: "The content of your message. Optional if media_id is present"
328 },
329 media_id: %Schema{type: :string, description: "The id of an upload"}
330 },
331 example: %{
332 "content" => "Hey wanna buy feet pics?",
333 "media_id" => "134234"
334 }
335 }
336 end
337
338 def mark_as_read do
339 %Schema{
340 title: "MarkAsReadRequest",
341 description: "POST body for marking a number of chat messages as read",
342 type: :object,
343 required: [:last_read_id],
344 properties: %{
345 last_read_id: %Schema{
346 type: :string,
347 description: "The content of your message."
348 }
349 },
350 example: %{
351 "last_read_id" => "abcdef12456"
352 }
353 }
354 end
355 end