mastodon api: embed relationship card under account card for Pleroma FE convenience
authorWilliam Pitcock <nenolod@dereferenced.org>
Wed, 27 Feb 2019 13:01:10 +0000 (13:01 +0000)
committerWilliam Pitcock <nenolod@dereferenced.org>
Wed, 27 Feb 2019 13:01:10 +0000 (13:01 +0000)
lib/pleroma/web/mastodon_api/views/account_view.ex
test/web/mastodon_api/account_view_test.exs

index 8fdefdebd167208f522251f6fe41c1097c7b869c..c32f27be2afd75a8cc0f8c64c083230c4b2ca297 100644 (file)
@@ -32,7 +32,11 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
     }
   end
 
-  def render("relationship.json", %{user: user, target: target}) do
+  def render("relationship.json", %{user: nil, target: _target}) do
+    %{}
+  end
+
+  def render("relationship.json", %{user: %User{} = user, target: %User{} = target}) do
     follow_activity = Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(user, target)
 
     requested =
@@ -85,6 +89,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
 
     bio = HTML.filter_tags(user.bio, User.html_filter_policy(opts[:for]))
 
+    relationship = render("relationship.json", %{user: opts[:for], target: user})
+
     %{
       id: to_string(user.id),
       username: username_from_nickname(user.nickname),
@@ -115,7 +121,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
         confirmation_pending: user_info.confirmation_pending,
         tags: user.tags,
         is_moderator: user.info.is_moderator,
-        is_admin: user.info.is_admin
+        is_admin: user.info.is_admin,
+        relationship: relationship
       }
     }
   end
index f8cd68173b2d6ad0384d346b676ae96a896b2c9c..6be66ef6367db297ecd7797f45aa48d2f466f6ca 100644 (file)
@@ -63,7 +63,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
         confirmation_pending: false,
         tags: [],
         is_admin: false,
-        is_moderator: false
+        is_moderator: false,
+        relationship: %{}
       }
     }
 
@@ -106,7 +107,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
         confirmation_pending: false,
         tags: [],
         is_admin: false,
-        is_moderator: false
+        is_moderator: false,
+        relationship: %{}
       }
     }
 
@@ -148,4 +150,64 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
 
     assert expected == AccountView.render("relationship.json", %{user: user, target: other_user})
   end
+
+  test "represent an embedded relationship" do
+    user =
+      insert(:user, %{
+        info: %{note_count: 5, follower_count: 3, source_data: %{"type" => "Service"}},
+        nickname: "shp@shitposter.club",
+        inserted_at: ~N[2017-08-15 15:47:06.597036]
+      })
+
+    other_user = insert(:user)
+
+    {:ok, other_user} = User.follow(other_user, user)
+    {:ok, other_user} = User.block(other_user, user)
+
+    expected = %{
+      id: to_string(user.id),
+      username: "shp",
+      acct: user.nickname,
+      display_name: user.name,
+      locked: false,
+      created_at: "2017-08-15T15:47:06.000Z",
+      followers_count: 3,
+      following_count: 0,
+      statuses_count: 5,
+      note: user.bio,
+      url: user.ap_id,
+      avatar: "http://localhost:4001/images/avi.png",
+      avatar_static: "http://localhost:4001/images/avi.png",
+      header: "http://localhost:4001/images/banner.png",
+      header_static: "http://localhost:4001/images/banner.png",
+      emojis: [],
+      fields: [],
+      bot: true,
+      source: %{
+        note: "",
+        privacy: "public",
+        sensitive: false
+      },
+      pleroma: %{
+        confirmation_pending: false,
+        tags: [],
+        is_admin: false,
+        is_moderator: false,
+        relationship: %{
+          id: to_string(user.id),
+          following: false,
+          followed_by: false,
+          blocking: true,
+          muting: false,
+          muting_notifications: false,
+          requested: false,
+          domain_blocking: false,
+          showing_reblogs: false,
+          endorsed: false
+        }
+      }
+    }
+
+    assert expected == AccountView.render("account.json", %{user: user, for: other_user})
+  end
 end