StatusView: Add `emoji_reactions`
authorlain <lain@soykaf.club>
Mon, 20 Jan 2020 15:24:20 +0000 (16:24 +0100)
committerlain <lain@soykaf.club>
Mon, 20 Jan 2020 15:24:20 +0000 (16:24 +0100)
CHANGELOG.md
docs/API/differences_in_mastoapi_responses.md
lib/pleroma/web/mastodon_api/views/status_view.ex
test/web/mastodon_api/views/status_view_test.exs

index af497dcbabf0042450f9bb5781e36b08c1a77737..871b01ca336e0a266fe1f8ee8ce453b48755b281 100644 (file)
@@ -93,6 +93,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Captcha: Support native provider
 - Captcha: Enable by default
 - Mastodon API: Add support for `account_id` param to filter notifications by the account
+- Mastodon API: Add `emoji_reactions` property to Statuses
 </details>
 
 ### Fixed
index bb62ed5f21b58a1e92a08c72f271fadc0e604538..50076cf98aa65649071d335dd5803f2329855e8a 100644 (file)
@@ -29,6 +29,7 @@ Has these additional fields under the `pleroma` object:
 - `spoiler_text`: a map consisting of alternate representations of the `spoiler_text` property with the key being it's mimetype. Currently the only alternate representation supported is `text/plain`
 - `expires_at`: a datetime (iso8601) that states when the post will expire (be deleted automatically), or empty if the post won't expire
 - `thread_muted`: true if the thread the post belongs to is muted
+- `emoji_reactions`: An object with all the emoji reactions with count. Contains no information about the reacting users, for that use the `emoji_reactions_by` endpoint.
 
 ## Attachments
 
index e9590224b75e94399e4e54aca21472084c5799d9..b59ac39bc4908f6d7453b6d2fb1c70976d759ee9 100644 (file)
@@ -253,6 +253,16 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
           nil
       end
 
+    emoji_reactions =
+      with %{data: %{"reactions" => emoji_reactions}} <- object do
+        Enum.map(emoji_reactions, fn {emoji, users} ->
+          {emoji, length(users)}
+        end)
+        |> Enum.into(%{})
+      else
+        _ -> %{}
+      end
+
     %{
       id: to_string(activity.id),
       uri: object.data["id"],
@@ -293,7 +303,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
         spoiler_text: %{"text/plain" => summary_plaintext},
         expires_at: expires_at,
         direct_conversation_id: direct_conversation_id,
-        thread_muted: thread_muted?
+        thread_muted: thread_muted?,
+        emoji_reactions: emoji_reactions
       }
     }
   end
index 17b6ebcbcacbb756ff16147461a707308a5bb6cb..b54b19c0b3d1929a082ea9781ef86be5306a0461 100644 (file)
@@ -24,6 +24,22 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
     :ok
   end
 
+  test "has an emoji reaction list" do
+    user = insert(:user)
+    other_user = insert(:user)
+    third_user = insert(:user)
+    {:ok, activity} = CommonAPI.post(user, %{"status" => "dae cofe??"})
+
+    {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, user, "☕")
+    {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
+    {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, third_user, "🍵")
+    activity = Repo.get(Activity, activity.id)
+    status = StatusView.render("show.json", activity: activity)
+
+    assert status[:pleroma][:emoji_reactions]["🍵"] == 1
+    assert status[:pleroma][:emoji_reactions]["☕"] == 2
+  end
+
   test "loads and returns the direct conversation id when given the `with_direct_conversation_id` option" do
     user = insert(:user)
 
@@ -172,7 +188,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
         spoiler_text: %{"text/plain" => HTML.strip_tags(object_data["summary"])},
         expires_at: nil,
         direct_conversation_id: nil,
-        thread_muted: false
+        thread_muted: false,
+        emoji_reactions: %{}
       }
     }