logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma
commit: 49929321c761cf389d42ca52d88dc8ec09a375cc
parent: f03524805fdc95b9681f59a68a1edb2885f2e7ba
Author: Roger Braun <rbraun@Bobble.local>
Date:   Wed, 13 Sep 2017 15:55:10 +0200

Add relationships to masto api.

Diffstat:

Mlib/pleroma/web/mastodon_api/mastodon_api_controller.ex9+++++++++
Mlib/pleroma/web/mastodon_api/views/account_view.ex17+++++++++++++++++
Mlib/pleroma/web/router.ex2++
Mtest/web/mastodon_api/account_view_test.exs20++++++++++++++++++++
Mtest/web/mastodon_api/mastodon_api_controller_test.exs17+++++++++++++++++
5 files changed, 65 insertions(+), 0 deletions(-)

diff --git 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 @@ 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, []) diff --git 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 @@ 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 diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex @@ -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 diff --git 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 @@ 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 diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs @@ -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