134 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
| # Pleroma: A lightweight social networking server
 | |
| # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 | |
| # SPDX-License-Identifier: AGPL-3.0-only
 | |
| 
 | |
| defmodule Pleroma.Web.ApiSpec.EmojiReactionOperation do
 | |
|   alias OpenApiSpex.Operation
 | |
|   alias OpenApiSpex.Schema
 | |
|   alias Pleroma.Web.ApiSpec.Schemas.Account
 | |
|   alias Pleroma.Web.ApiSpec.Schemas.ApiError
 | |
|   alias Pleroma.Web.ApiSpec.Schemas.FlakeID
 | |
|   alias Pleroma.Web.ApiSpec.Schemas.Status
 | |
| 
 | |
|   def open_api_operation(action) do
 | |
|     operation = String.to_existing_atom("#{action}_operation")
 | |
|     apply(__MODULE__, operation, [])
 | |
|   end
 | |
| 
 | |
|   def index_operation do
 | |
|     %Operation{
 | |
|       tags: ["Emoji reactions"],
 | |
|       summary:
 | |
|         "Get an object of emoji to account mappings with accounts that reacted to the post",
 | |
|       parameters: [
 | |
|         Operation.parameter(:id, :path, FlakeID, "Status ID", required: true),
 | |
|         Operation.parameter(:emoji, :path, :string, "Filter by a single unicode emoji",
 | |
|           required: nil
 | |
|         ),
 | |
|         Operation.parameter(
 | |
|           :with_muted,
 | |
|           :query,
 | |
|           :boolean,
 | |
|           "Include reactions from muted acccounts."
 | |
|         )
 | |
|       ],
 | |
|       security: [%{"oAuth" => ["read:statuses"]}],
 | |
|       operationId: "EmojiReactionController.index",
 | |
|       responses: %{
 | |
|         200 => array_of_reactions_response()
 | |
|       }
 | |
|     }
 | |
|   end
 | |
| 
 | |
|   def create_operation do
 | |
|     %Operation{
 | |
|       tags: ["Emoji reactions"],
 | |
|       summary: "React to a post with either a unicode or custom emoji",
 | |
|       parameters: [
 | |
|         Operation.parameter(:id, :path, FlakeID, "Status ID", required: true),
 | |
|         Operation.parameter(
 | |
|           :emoji,
 | |
|           :path,
 | |
|           :string,
 | |
|           "A single character unicode emoji, or a \:shortcode\: format emoji name",
 | |
|           required: true
 | |
|         )
 | |
|       ],
 | |
|       security: [%{"oAuth" => ["write:statuses"]}],
 | |
|       operationId: "EmojiReactionController.create",
 | |
|       responses: %{
 | |
|         200 => Operation.response("Status", "application/json", Status),
 | |
|         400 => Operation.response("Bad Request", "application/json", ApiError)
 | |
|       }
 | |
|     }
 | |
|   end
 | |
| 
 | |
|   def delete_operation do
 | |
|     %Operation{
 | |
|       tags: ["Emoji reactions"],
 | |
|       summary: "Remove a reaction to a post with either a unicode or custom emoji",
 | |
|       parameters: [
 | |
|         Operation.parameter(:id, :path, FlakeID, "Status ID", required: true),
 | |
|         Operation.parameter(
 | |
|           :emoji,
 | |
|           :path,
 | |
|           :string,
 | |
|           "A single character unicode emoji, or a \:shortcode\: format emoji name",
 | |
|           required: true
 | |
|         )
 | |
|       ],
 | |
|       security: [%{"oAuth" => ["write:statuses"]}],
 | |
|       operationId: "EmojiReactionController.delete",
 | |
|       responses: %{
 | |
|         200 => Operation.response("Status", "application/json", Status)
 | |
|       }
 | |
|     }
 | |
|   end
 | |
| 
 | |
|   defp array_of_reactions_response do
 | |
|     Operation.response("Array of Emoji reactions", "application/json", %Schema{
 | |
|       type: :array,
 | |
|       items: emoji_reaction(),
 | |
|       example: emoji_reaction().example
 | |
|     })
 | |
|   end
 | |
| 
 | |
|   defp emoji_reaction do
 | |
|     %Schema{
 | |
|       title: "EmojiReaction",
 | |
|       type: :object,
 | |
|       properties: %{
 | |
|         name: %Schema{type: :string, description: "Emoji"},
 | |
|         count: %Schema{type: :integer, description: "Count of reactions with this emoji"},
 | |
|         me: %Schema{type: :boolean, description: "Did I react with this emoji?"},
 | |
|         url: %Schema{
 | |
|           type: :string,
 | |
|           description: "URL of the emoji if it's custom - otherwise null",
 | |
|           nullable: true,
 | |
|           format: "url"
 | |
|         },
 | |
|         accounts: %Schema{
 | |
|           type: :array,
 | |
|           items: Account,
 | |
|           description: "Array of accounts reacted with this emoji"
 | |
|         }
 | |
|       },
 | |
|       example: [
 | |
|         %{
 | |
|           "name" => "😱",
 | |
|           "count" => 1,
 | |
|           "me" => false,
 | |
|           "url" => nil,
 | |
|           "accounts" => [Account.schema().example]
 | |
|         },
 | |
|         %{
 | |
|           "name" => "dinosaur",
 | |
|           "count" => 1,
 | |
|           "me" => false,
 | |
|           "url" => "https://akkoma.dev/emoji/dinosaur.png",
 | |
|           "accounts" => [Account.schema().example]
 | |
|         }
 | |
|       ]
 | |
|     }
 | |
|   end
 | |
| end
 | 
