Pleroma API: Add endpoint to get reaction information on a single emoji
authorlain <lain@soykaf.club>
Wed, 19 Feb 2020 16:16:45 +0000 (17:16 +0100)
committerlain <lain@soykaf.club>
Wed, 19 Feb 2020 16:16:45 +0000 (17:16 +0100)
lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex
lib/pleroma/web/router.ex
test/web/pleroma_api/controllers/pleroma_api_controller_test.exs

index 108e48438ca139ac62ac543bc6b0674ce87af029..f86a068fb56c741bb532b0e6b14bcbbfc3923f53 100644 (file)
@@ -41,24 +41,29 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do
 
   plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug)
 
-  def emoji_reactions_by(%{assigns: %{user: user}} = conn, %{"id" => activity_id}) do
+  def emoji_reactions_by(%{assigns: %{user: user}} = conn, %{"id" => activity_id} = params) do
     with %Activity{} = activity <- Activity.get_by_id_with_object(activity_id),
          %Object{data: %{"reactions" => emoji_reactions}} when is_list(emoji_reactions) <-
            Object.normalize(activity) do
       reactions =
         emoji_reactions
         |> Enum.map(fn [emoji, user_ap_ids] ->
-          users =
-            Enum.map(user_ap_ids, &User.get_cached_by_ap_id/1)
-            |> Enum.filter(& &1)
-
-          %{
-            name: emoji,
-            count: length(users),
-            accounts: AccountView.render("index.json", %{users: users, for: user, as: :user}),
-            me: !!(user && user.ap_id in user_ap_ids)
-          }
+          if params["emoji"] && params["emoji"] != emoji do
+            nil
+          else
+            users =
+              Enum.map(user_ap_ids, &User.get_cached_by_ap_id/1)
+              |> Enum.filter(& &1)
+
+            %{
+              name: emoji,
+              count: length(users),
+              accounts: AccountView.render("index.json", %{users: users, for: user, as: :user}),
+              me: !!(user && user.ap_id in user_ap_ids)
+            }
+          end
         end)
+        |> Enum.filter(& &1)
 
       conn
       |> json(reactions)
index 89721569826113d8f1b2b3106bfd3f9fb9a9f8a8..9bfe867044bddcd7cd4134eba30fa17c799ecff2 100644 (file)
@@ -271,6 +271,7 @@ defmodule Pleroma.Web.Router do
   scope "/api/v1/pleroma", Pleroma.Web.PleromaAPI do
     pipe_through(:api)
 
+    get("/statuses/:id/reactions/:emoji", PleromaAPIController, :emoji_reactions_by)
     get("/statuses/:id/reactions", PleromaAPIController, :emoji_reactions_by)
   end
 
index 36868db38c9f96a28a8bd0ec2aa9865aea257e57..164cfa695f3daf90bf854b3c655996776e9c2707 100644 (file)
@@ -96,6 +96,32 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do
              result
   end
 
+  test "GET /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do
+    user = insert(:user)
+    other_user = insert(:user)
+
+    {:ok, activity} = CommonAPI.post(user, %{"status" => "#cofe"})
+
+    result =
+      conn
+      |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅")
+      |> json_response(200)
+
+    assert result == []
+
+    {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅")
+    {:ok, _, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕")
+
+    result =
+      conn
+      |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅")
+      |> json_response(200)
+
+    [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result
+
+    assert represented_user["id"] == other_user.id
+  end
+
   test "/api/v1/pleroma/conversations/:id" do
     user = insert(:user)
     %{user: other_user, conn: conn} = oauth_access(["read:statuses"])