defmodule Pleroma.Web.ApiSpec.ChatOperation do
alias OpenApiSpex.Operation
alias OpenApiSpex.Schema
- alias Pleroma.Web.ApiSpec.Helpers
- alias Pleroma.Web.ApiSpec.Schemas.ChatMessageCreateRequest
- alias Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse
- alias Pleroma.Web.ApiSpec.Schemas.ChatResponse
+ alias Pleroma.Web.ApiSpec.Schemas.ApiError
+ alias Pleroma.Web.ApiSpec.Schemas.Chat
+ alias Pleroma.Web.ApiSpec.Schemas.ChatMessage
+
+ import Pleroma.Web.ApiSpec.Helpers
@spec open_api_operation(atom) :: Operation.t()
def open_api_operation(action) do
apply(__MODULE__, operation, [])
end
+ def mark_as_read_operation do
+ %Operation{
+ tags: ["chat"],
+ summary: "Mark all messages in the chat as read",
+ operationId: "ChatController.mark_as_read",
+ parameters: [Operation.parameter(:id, :path, :string, "The ID of the Chat")],
+ requestBody: request_body("Parameters", mark_as_read()),
+ responses: %{
+ 200 =>
+ Operation.response(
+ "The updated chat",
+ "application/json",
+ Chat
+ )
+ },
+ security: [
+ %{
+ "oAuth" => ["write:chats"]
+ }
+ ]
+ }
+ end
+
+ def mark_message_as_read_operation do
+ %Operation{
+ tags: ["chat"],
+ summary: "Mark one message in the chat as read",
+ operationId: "ChatController.mark_message_as_read",
+ parameters: [
+ Operation.parameter(:id, :path, :string, "The ID of the Chat"),
+ Operation.parameter(:message_id, :path, :string, "The ID of the message")
+ ],
+ responses: %{
+ 200 =>
+ Operation.response(
+ "The read ChatMessage",
+ "application/json",
+ ChatMessage
+ )
+ },
+ security: [
+ %{
+ "oAuth" => ["write:chats"]
+ }
+ ]
+ }
+ end
+
+ def show_operation do
+ %Operation{
+ tags: ["chat"],
+ summary: "Create a chat",
+ operationId: "ChatController.show",
+ parameters: [
+ Operation.parameter(
+ :id,
+ :path,
+ :string,
+ "The id of the chat",
+ required: true,
+ example: "1234"
+ )
+ ],
+ responses: %{
+ 200 =>
+ Operation.response(
+ "The existing chat",
+ "application/json",
+ Chat
+ )
+ },
+ security: [
+ %{
+ "oAuth" => ["read"]
+ }
+ ]
+ }
+ end
+
def create_operation do
%Operation{
tags: ["chat"],
Operation.response(
"The created or existing chat",
"application/json",
- ChatResponse
+ Chat
)
},
security: [
%{
- "oAuth" => ["write"]
+ "oAuth" => ["write:chats"]
}
]
}
tags: ["chat"],
summary: "Get a list of chats that you participated in",
operationId: "ChatController.index",
- parameters: [
- Operation.parameter(:limit, :query, :integer, "How many results to return", example: 20),
- Operation.parameter(:min_id, :query, :string, "Return only chats after this id"),
- Operation.parameter(:max_id, :query, :string, "Return only chats before this id")
- ],
+ parameters: pagination_params(),
responses: %{
200 => Operation.response("The chats of the user", "application/json", chats_response())
},
security: [
%{
- "oAuth" => ["read"]
+ "oAuth" => ["read:chats"]
}
]
}
tags: ["chat"],
summary: "Get the most recent messages of the chat",
operationId: "ChatController.messages",
- parameters: [
- Operation.parameter(:id, :path, :string, "The ID of the Chat"),
- Operation.parameter(:limit, :query, :integer, "How many results to return", example: 20),
- Operation.parameter(:min_id, :query, :string, "Return only messages after this id"),
- Operation.parameter(:max_id, :query, :string, "Return only messages before this id")
- ],
+ parameters:
+ [Operation.parameter(:id, :path, :string, "The ID of the Chat")] ++
+ pagination_params(),
responses: %{
200 =>
Operation.response(
},
security: [
%{
- "oAuth" => ["read"]
+ "oAuth" => ["read:chats"]
}
]
}
parameters: [
Operation.parameter(:id, :path, :string, "The ID of the Chat")
],
- requestBody: Helpers.request_body("Parameters", ChatMessageCreateRequest, required: true),
+ requestBody: request_body("Parameters", chat_message_create()),
responses: %{
200 =>
Operation.response(
"The newly created ChatMessage",
"application/json",
- ChatMessageResponse
+ ChatMessage
+ ),
+ 400 => Operation.response("Bad Request", "application/json", ApiError)
+ },
+ security: [
+ %{
+ "oAuth" => ["write:chats"]
+ }
+ ]
+ }
+ end
+
+ def delete_message_operation do
+ %Operation{
+ tags: ["chat"],
+ summary: "delete_message",
+ operationId: "ChatController.delete_message",
+ parameters: [
+ Operation.parameter(:id, :path, :string, "The ID of the Chat"),
+ Operation.parameter(:message_id, :path, :string, "The ID of the message")
+ ],
+ responses: %{
+ 200 =>
+ Operation.response(
+ "The deleted ChatMessage",
+ "application/json",
+ ChatMessage
)
},
security: [
%{
- "oAuth" => ["write"]
+ "oAuth" => ["write:chats"]
}
]
}
title: "ChatsResponse",
description: "Response schema for multiple Chats",
type: :array,
- items: ChatResponse,
+ items: Chat,
example: [
%{
"account" => %{
title: "ChatMessagesResponse",
description: "Response schema for multiple ChatMessages",
type: :array,
- items: ChatMessageResponse,
+ items: ChatMessage,
example: [
%{
"emojis" => [
"content" => "Check this out :firefox:",
"id" => "13",
"chat_id" => "1",
- "actor_id" => "someflakeid"
+ "actor_id" => "someflakeid",
+ "unread" => false
},
%{
"actor_id" => "someflakeid",
"id" => "12",
"chat_id" => "1",
"emojis" => [],
- "created_at" => "2020-04-21T15:06:45.000Z"
+ "created_at" => "2020-04-21T15:06:45.000Z",
+ "unread" => false
}
]
}
end
+
+ def chat_message_create do
+ %Schema{
+ title: "ChatMessageCreateRequest",
+ description: "POST body for creating an chat message",
+ type: :object,
+ properties: %{
+ content: %Schema{
+ type: :string,
+ description: "The content of your message. Optional if media_id is present"
+ },
+ media_id: %Schema{type: :string, description: "The id of an upload"}
+ },
+ example: %{
+ "content" => "Hey wanna buy feet pics?",
+ "media_id" => "134234"
+ }
+ }
+ end
+
+ def mark_as_read do
+ %Schema{
+ title: "MarkAsReadRequest",
+ description: "POST body for marking a number of chat messages as read",
+ type: :object,
+ required: [:last_read_id],
+ properties: %{
+ last_read_id: %Schema{
+ type: :string,
+ description: "The content of your message."
+ }
+ },
+ example: %{
+ "last_read_id" => "abcdef12456"
+ }
+ }
+ end
end