def create_operation do
%Operation{
tags: ["Emoji reactions"],
- summary: "React to a post with a unicode emoji",
+ 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",
+ Operation.parameter(
+ :emoji,
+ :path,
+ :string,
+ "A single character unicode emoji, or a \:shortcode\: format emoji name",
required: true
)
],
def delete_operation do
%Operation{
tags: ["Emoji reactions"],
- summary: "Remove a reaction to a post with a unicode emoji",
+ 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",
+ Operation.parameter(
+ :emoji,
+ :path,
+ :string,
+ "A single character unicode emoji, or a \:shortcode\: format emoji name",
required: true
)
],
Operation.response("Array of Emoji reactions", "application/json", %Schema{
type: :array,
items: emoji_reaction(),
- example: [emoji_reaction().example]
+ example: emoji_reaction().example
})
end
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,
- "accounts" => [Account.schema().example]
- }
+ 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
%{"name" => "☕", "count" => 1, "me" => true, "url" => nil}
]
+ {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"})
+
+ ObanHelpers.perform_all()
+ # Reacting with a custom emoji
+ result =
+ conn
+ |> assign(:user, other_user)
+ |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"]))
+ |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/:dinosaur:")
+ |> json_response_and_validate_schema(200)
+
+ # We return the status, but this our implementation detail.
+ assert %{"id" => id} = result
+ assert to_string(activity.id) == id
+
+ assert result["pleroma"]["emoji_reactions"] == [
+ %{
+ "name" => "dinosaur",
+ "count" => 1,
+ "me" => true,
+ "url" => "http://localhost:4001/emoji/dino walking.gif"
+ }
+ ]
+
# Reacting with a non-emoji
assert conn
|> assign(:user, other_user)
{:ok, activity} = CommonAPI.post(user, %{status: "#cofe"})
{:ok, _reaction_activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
+ {:ok, _reaction_activity} = CommonAPI.react_with_emoji(activity.id, other_user, ":dinosaur:")
ObanHelpers.perform_all()
assert %{"id" => id} = json_response_and_validate_schema(result, 200)
assert to_string(activity.id) == id
+ # Remove custom emoji
+
+ result =
+ conn
+ |> assign(:user, other_user)
+ |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"]))
+ |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/:dinosaur:")
+
+ assert %{"id" => id} = json_response_and_validate_schema(result, 200)
+ assert to_string(activity.id) == id
+
ObanHelpers.perform_all()
object = Object.get_by_ap_id(activity.data["object"])