From 49929321c761cf389d42ca52d88dc8ec09a375cc Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Wed, 13 Sep 2017 15:55:10 +0200 Subject: [PATCH] Add relationships to masto api. --- .../mastodon_api/mastodon_api_controller.ex | 9 +++++++++ .../web/mastodon_api/views/account_view.ex | 17 ++++++++++++++++ lib/pleroma/web/router.ex | 2 ++ test/web/mastodon_api/account_view_test.exs | 20 +++++++++++++++++++ .../mastodon_api_controller_test.exs | 17 ++++++++++++++++ 5 files changed, 65 insertions(+) diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index 219d860a9..69b559a09 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -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 @@ def notifications(%{assigns: %{user: user}} = conn, params) 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, []) diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 85cce754a..4e9ee4132 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -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 @@ def render("mention.json", %{user: user}) 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 diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 161635558..883fd56f4 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -56,6 +56,8 @@ def user_fetcher(username) 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 diff --git a/test/web/mastodon_api/account_view_test.exs b/test/web/mastodon_api/account_view_test.exs index 0106fbcc0..259258281 100644 --- a/test/web/mastodon_api/account_view_test.exs +++ b/test/web/mastodon_api/account_view_test.exs @@ -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 @@ test "Represent a smaller mention" 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 diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs index e87430d3f..52415bb50 100644 --- a/test/web/mastodon_api/mastodon_api_controller_test.exs +++ b/test/web/mastodon_api/mastodon_api_controller_test.exs @@ -181,4 +181,21 @@ test "gets a users statuses", %{conn: conn} 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