Add relationships to masto api.
authorRoger Braun <rbraun@Bobble.local>
Wed, 13 Sep 2017 13:55:10 +0000 (15:55 +0200)
committerRoger Braun <rbraun@Bobble.local>
Wed, 13 Sep 2017 13:55:10 +0000 (15:55 +0200)
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
lib/pleroma/web/mastodon_api/views/account_view.ex
lib/pleroma/web/router.ex
test/web/mastodon_api/account_view_test.exs
test/web/mastodon_api/mastodon_api_controller_test.exs

index 219d860a9c7b0a7e29cccab1f0ef3a1992ad41ec..69b559a09a4f59d3d09726d616d5a863865b3d2e 100644 (file)
@@ -7,6 +7,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
   alias Pleroma.Web.ActivityPub.ActivityPub
   alias Pleroma.Web.TwitterAPI.TwitterAPI
   alias Pleroma.Web.CommonAPI
+  import Ecto.Query
   import Logger
 
   def create_app(conn, params) do
@@ -177,6 +178,14 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     |> json(result)
   end
 
+  def relationships(%{assigns: %{user: user}} = conn, %{"id" => id}) do
+    id = List.wrap(id)
+    q = from u in User,
+      where: u.id in ^id
+    targets = Repo.all(q)
+    render conn, AccountView, "relationships.json", %{user: user, targets: targets}
+  end
+
   def empty_array(conn, _) do
     Logger.debug("Unimplemented, returning an empty array")
     json(conn, [])
index 85cce754a7859865126a5f5ceaa4026cc4969448..4e9ee413207e662e2ec7e0d05f5ff539cf6c16e1 100644 (file)
@@ -1,6 +1,7 @@
 defmodule Pleroma.Web.MastodonAPI.AccountView do
   use Pleroma.Web, :view
   alias Pleroma.User
+  alias Pleroma.Web.MastodonAPI.AccountView
 
   defp image_url(%{"url" => [ %{ "href" => href } | t ]}), do: href
   defp image_url(_), do: nil
@@ -38,4 +39,20 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
       url: user.ap_id
     }
   end
+
+  def render("relationship.json", %{user: user, target: target}) do
+    %{
+      id: target.id,
+      following: User.following?(target, user),
+      followed_by: User.following?(user, target),
+      blocking: false,
+      muting: false,
+      requested: false,
+      domain_blocking: false
+    }
+  end
+
+  def render("relationships.json", %{user: user, targets: targets}) do
+    render_many(targets, AccountView, "relationship.json", user: user, as: :target)
+  end
 end
index 161635558b6ddcec1b1040d62fec44903b95826c..883fd56f4b0214ccea84b81d091dfd0dba9199fd 100644 (file)
@@ -56,6 +56,8 @@ defmodule Pleroma.Web.Router do
     pipe_through :authenticated_api
 
     get "/accounts/verify_credentials", MastodonAPIController, :verify_credentials
+    get "/accounts/relationships", MastodonAPIController, :relationships
+
     get "/timelines/home", MastodonAPIController, :home_timeline
 
     post "/statuses", MastodonAPIController, :post_status
index 0106fbcc0f5c43797ba71a95a1db56cc88ea536f..259258281c8bb731ab9a5c27c9845e9278840698 100644 (file)
@@ -2,6 +2,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
   use Pleroma.DataCase
   import Pleroma.Factory
   alias Pleroma.Web.MastodonAPI.AccountView
+  alias Pleroma.User
 
   test "Represent a user account" do
     user = insert(:user, %{info: %{"note_count" => 5, "follower_count" => 3}, nickname: "shp@shitposter.club"})
@@ -39,4 +40,23 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
 
     assert expected == AccountView.render("mention.json", %{user: user})
   end
+
+  test "represent a relationship" do
+    user = insert(:user)
+    other_user = insert(:user)
+
+    {:ok, user} = User.follow(user, other_user)
+
+    expected = %{
+      id: other_user.id,
+      following: false,
+      followed_by: true,
+      blocking: false,
+      muting: false,
+      requested: false,
+      domain_blocking: false
+    }
+
+    assert expected == AccountView.render("relationship.json", %{user: user, target: other_user})
+  end
 end
index e87430d3fd0ca10b00897d36ea21262f983f4383..52415bb50550c3ba2db0abed02ae0a7568e6184c 100644 (file)
@@ -181,4 +181,21 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
       assert id == note_two.id
     end
   end
+
+  describe "user relationships" do
+    test "returns the relationships for the current user", %{conn: conn} do
+      user = insert(:user)
+      other_user = insert(:user)
+
+      {:ok, user} = User.follow(user, other_user)
+
+      conn = conn
+      |> assign(:user, user)
+      |> get("/api/v1/accounts/relationships", %{"id" => [other_user.id]})
+
+      assert [relationship] = json_response(conn, 200)
+
+      assert other_user.id == relationship["id"]
+    end
+  end
 end