Change relationship direction of subscriptions
authorSadposter <hannah+pleroma@coffee-and-dreams.uk>
Fri, 5 Apr 2019 15:51:45 +0000 (16:51 +0100)
committerHannah Ward <Hannah.ward9001@gmail.com>
Fri, 5 Apr 2019 16:02:07 +0000 (17:02 +0100)
12 files changed:
lib/pleroma/user.ex
lib/pleroma/user/info.ex
lib/pleroma/web/common_api/utils.ex
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
lib/pleroma/web/mastodon_api/views/account_view.ex
lib/pleroma/web/router.ex
lib/pleroma/web/twitter_api/twitter_api.ex
lib/pleroma/web/twitter_api/twitter_api_controller.ex
lib/pleroma/web/twitter_api/views/user_view.ex
test/web/mastodon_api/account_view_test.exs
test/web/mastodon_api/mastodon_api_controller_test.exs
test/web/twitter_api/views/user_view_test.exs

index de7ed6e72fb96221ec5a08849a66cfa9b073f999..f1565ade7b94fe9550620c505fa296c3ec449eee 100644 (file)
@@ -924,23 +924,27 @@ defmodule Pleroma.User do
   end
 
   def subscribe(subscriber, %{ap_id: ap_id}) do
-    info_cng =
-      subscriber.info
-      |> User.Info.add_to_subscriptions(ap_id)
+    with %User{} = user <- get_or_fetch_by_ap_id(ap_id) do
+      info_cng =
+        user.info
+        |> User.Info.add_to_subscribers(subscriber.ap_id)
 
-    change(subscriber)
-    |> put_embed(:info, info_cng)
-    |> update_and_set_cache()
+      change(user)
+      |> put_embed(:info, info_cng)
+      |> update_and_set_cache()
+    end
   end
 
   def unsubscribe(unsubscriber, %{ap_id: ap_id}) do
-    info_cng =
-      unsubscriber.info
-      |> User.Info.remove_from_subscriptions(ap_id)
+    with %User{} = user <- get_or_fetch_by_ap_id(ap_id) do
+      info_cng =
+        user.info
+        |> User.Info.remove_from_subscribers(unsubscriber.ap_id)
 
-    change(unsubscriber)
-    |> put_embed(:info, info_cng)
-    |> update_and_set_cache()
+      change(user)
+      |> put_embed(:info, info_cng)
+      |> update_and_set_cache()
+    end
   end
 
   def block(blocker, %User{ap_id: ap_id} = blocked) do
@@ -1000,8 +1004,9 @@ defmodule Pleroma.User do
   end
 
   def subscribed_to?(user, %{ap_id: ap_id}) do
-    subs = user.info.subscriptions
-    Enum.member?(subs, ap_id)
+    with %User{} = target <- User.get_by_ap_id(ap_id) do
+      Enum.member?(target.info.subscribers, user.ap_id)
+    end
   end
 
   def muted_users(user),
@@ -1010,13 +1015,8 @@ defmodule Pleroma.User do
   def blocked_users(user),
     do: Repo.all(from(u in User, where: u.ap_id in ^user.info.blocks))
 
-  def subscribed_users(user),
-    do:
-      Repo.all(
-        from(u in User,
-          where: fragment("?->'subscriptions' @> ?", u.info, ^user.ap_id)
-        )
-      )
+  def subscribers(user),
+    do: Repo.all(from(u in User, where: u.ap_id in ^user.info.subscribers))
 
   def block_domain(user, domain) do
     info_cng =
index 1746da576932081237fa638c0c4b6c8f477121ef..1cf46feb3df449546f04cb14c7602fa020d135db 100644 (file)
@@ -22,7 +22,7 @@ defmodule Pleroma.User.Info do
     field(:domain_blocks, {:array, :string}, default: [])
     field(:mutes, {:array, :string}, default: [])
     field(:muted_reblogs, {:array, :string}, default: [])
-    field(:subscriptions, {:array, :string}, default: [])
+    field(:subscribers, {:array, :string}, default: [])
     field(:deactivated, :boolean, default: false)
     field(:no_rich_text, :boolean, default: false)
     field(:ap_enabled, :boolean, default: false)
@@ -94,12 +94,12 @@ defmodule Pleroma.User.Info do
     |> validate_required([:blocks])
   end
 
-  def set_subscriptions(info, subscriptions) do
-    params = %{subscriptions: subscriptions}
+  def set_subscribers(info, subscribers) do
+    params = %{subscribers: subscribers}
 
     info
-    |> cast(params, [:subscriptions])
-    |> validate_required([:subscriptions])
+    |> cast(params, [:subscribers])
+    |> validate_required([:subscribers])
   end
 
   def add_to_mutes(info, muted) do
@@ -118,12 +118,12 @@ defmodule Pleroma.User.Info do
     set_blocks(info, List.delete(info.blocks, blocked))
   end
 
-  def add_to_subscriptions(info, subscribed) do
-    set_subscriptions(info, Enum.uniq([subscribed | info.subscriptions]))
+  def add_to_subscribers(info, subscribed) do
+    set_subscribers(info, Enum.uniq([subscribed | info.subscribers]))
   end
 
-  def remove_from_subscriptions(info, subscribed) do
-    set_subscriptions(info, List.delete(info.subscriptions, subscribed))
+  def remove_from_subscribers(info, subscribed) do
+    set_subscribers(info, List.delete(info.subscribers, subscribed))
   end
 
   def set_domain_blocks(info, domain_blocks) do
index 087778dfe9f54b47cce5ab62c07ef928be4ace3f..4e0a6b2d9be8e5c927a422d600804b4d9adfc8d5 100644 (file)
@@ -343,7 +343,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do
     with %User{} = user <- User.get_by_ap_id(actor) do
       subscriber_ids =
         user
-        |> User.subscribed_users()
+        |> User.subscribers()
         |> Enum.map(& &1.ap_id)
 
       recipients ++ subscriber_ids
index 89fd7629a87e45df99352e2c2fe0196482baa110..e848895f11ba42c8b52c7b7810b5d4cd862b507c 100644 (file)
@@ -863,6 +863,26 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     json(conn, %{})
   end
 
+  def subscribe(%{assigns: %{user: user}} = conn, %{"id" => id}) do
+    with %User{} = subscription_target <- User.get_by_id(id) do
+      {:ok, subscription_target} = User.subscribe(user, subscription_target)
+
+      conn
+      |> put_view(AccountView)
+      |> render("relationship.json", %{user: user, target: subscription_target})
+    end
+  end
+
+  def unsubscribe(%{assigns: %{user: user}} = conn, %{"id" => id}) do
+    with %User{} = subscription_target <- User.get_by_id(id) do
+      {:ok, subscription_target} = User.unsubscribe(user, subscription_target)
+
+      conn
+      |> put_view(AccountView)
+      |> render("relationship.json", %{user: user, target: subscription_target})
+    end
+  end
+
   def status_search(user, query) do
     fetched =
       if Regex.match?(~r/https?:/, query) do
index b5f3bbb9d0c4a291d67a306430232139faed9f13..42595b0b5cba741b490c7c865402f35de9ee3b3b 100644 (file)
@@ -53,6 +53,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
       blocking: User.blocks?(user, target),
       muting: User.mutes?(user, target),
       muting_notifications: false,
+      subscribing: User.subscribed_to?(user, target),
       requested: requested,
       domain_blocking: false,
       showing_reblogs: User.showing_reblogs?(user, target),
index 0b571fc0ba46a0286049ee157d6a287b9efeda3a..da988e5f2180bb82530417bf8595b6af5ad96c8e 100644 (file)
@@ -311,6 +311,9 @@ defmodule Pleroma.Web.Router do
 
       post("/domain_blocks", MastodonAPIController, :block_domain)
       delete("/domain_blocks", MastodonAPIController, :unblock_domain)
+
+      post("/pleroma/accounts/:id/subscribe", MastodonAPIController, :subscribe)
+      post("/pleroma/accounts/:id/unsubscribe", MastodonAPIController, :unsubscribe)
     end
 
     scope [] do
@@ -495,9 +498,6 @@ defmodule Pleroma.Web.Router do
       post("/pleroma/friendships/approve", TwitterAPI.Controller, :approve_friend_request)
       post("/pleroma/friendships/deny", TwitterAPI.Controller, :deny_friend_request)
 
-      post("/pleroma/subscriptions/create", TwitterAPI.Controller, :subscribe)
-      post("/pleroma/subscriptions/destroy", TwitterAPI.Controller, :unsubscribe)
-
       post("/friendships/create", TwitterAPI.Controller, :follow)
       post("/friendships/destroy", TwitterAPI.Controller, :unfollow)
 
index 5537680ad0bc031f388a71e7dae2ca2987a9cb92..9b081a3167141ce4d2fcdc780df88aa55df21c46 100644 (file)
@@ -59,20 +59,6 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
     end
   end
 
-  def subscribe(%User{} = subscriber, params) do
-    with {:ok, %User{} = subscribed} <- get_user(params),
-         {:ok, subscriber} <- User.subscribe(subscriber, subscribed) do
-      {:ok, subscriber, subscribed}
-    end
-  end
-
-  def unsubscribe(%User{} = unsubscriber, params) do
-    with {:ok, %User{} = unsubscribed} <- get_user(params),
-         {:ok, unsubscriber} <- User.unsubscribe(unsubscriber, unsubscribed) do
-      {:ok, unsubscriber, unsubscribed}
-    end
-  end
-
   def repeat(%User{} = user, ap_id_or_id) do
     with {:ok, _announce, %{data: %{"id" => id}}} <- CommonAPI.repeat(ap_id_or_id, user),
          %Activity{} = activity <- Activity.get_create_by_object_ap_id(id) do
index 0732705e68f0cf0be8bfd5b4353e54b79ac9f960..a7ec9949cb43de42d4313cf8d15b3dd59fb7c4b4 100644 (file)
@@ -269,30 +269,6 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
     end
   end
 
-  def subscribe(%{assigns: %{user: user}} = conn, params) do
-    case TwitterAPI.subscribe(user, params) do
-      {:ok, user, subscribed} ->
-        conn
-        |> put_view(UserView)
-        |> render("show.json", %{user: subscribed, for: user})
-
-      {:error, msg} ->
-        forbidden_json_reply(conn, msg)
-    end
-  end
-
-  def unsubscribe(%{assigns: %{user: user}} = conn, params) do
-    case TwitterAPI.unsubscribe(user, params) do
-      {:ok, user, unsubscribed} ->
-        conn
-        |> put_view(UserView)
-        |> render("show.json", %{user: unsubscribed, for: user})
-
-      {:error, msg} ->
-        forbidden_json_reply(conn, msg)
-    end
-  end
-
   def fetch_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
     with %Activity{} = activity <- Activity.get_by_id(id),
          true <- Visibility.visible_for_user?(activity, user) do
index c59570d3e08824ce2df59858833f192c5d0a0464..0791ed7608e1be3b3318d63a456f067d4d41ea02 100644 (file)
@@ -47,16 +47,15 @@ defmodule Pleroma.Web.TwitterAPI.UserView do
     for_user = assigns[:for]
     image = User.avatar_url(user) |> MediaProxy.url()
 
-    {following, follows_you, statusnet_blocking, subscribed} =
+    {following, follows_you, statusnet_blocking} =
       if for_user do
         {
           User.following?(for_user, user),
           User.following?(user, for_user),
-          User.blocks?(for_user, user),
-          User.subscribed_to?(for_user, user)
+          User.blocks?(for_user, user)
         }
       else
-        {false, false, false, false}
+        {false, false, false}
       end
 
     user_info = User.get_cached_user_info(user)
@@ -117,8 +116,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do
       "pleroma" =>
         %{
           "confirmation_pending" => user_info.confirmation_pending,
-          "tags" => user.tags,
-          "subscribed" => subscribed
+          "tags" => user.tags
         }
         |> maybe_with_activation_status(user, for_user)
     }
index 6dc60afe96280dcc9fa992950eff1e9a42d4efa6..48580ff1e1c8642e3ed4e0e2cc2d86dbbc45cda1 100644 (file)
@@ -142,6 +142,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
       blocking: true,
       muting: false,
       muting_notifications: false,
+      subscribing: false,
       requested: false,
       domain_blocking: false,
       showing_reblogs: true,
@@ -198,6 +199,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do
           following: false,
           followed_by: false,
           blocking: true,
+          subscribing: false,
           muting: false,
           muting_notifications: false,
           requested: false,
index 6060cc97feada708fa7e21dcb57e94739ec46bbb..811a2dd7b262dc85ac5521683c3ddcb7fbe213df 100644 (file)
@@ -1555,6 +1555,25 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     assert %{"id" => _id, "muting" => false} = json_response(conn, 200)
   end
 
+  test "subscribing / unsubscribing to a user", %{conn: conn} do
+    user = insert(:user)
+    subscription_target = insert(:user)
+
+    conn =
+      conn
+      |> assign(:user, user)
+      |> post("/api/v1/pleroma/accounts/#{subscription_target.id}/subscribe")
+
+    assert %{"id" => _id, "subscribing" => true} = json_response(conn, 200)
+
+    conn =
+      build_conn()
+      |> assign(:user, user)
+      |> post("/api/v1/pleroma/accounts/#{subscription_target.id}/unsubscribe")
+
+    assert %{"id" => _id, "subscribing" => false} = json_response(conn, 200)
+  end
+
   test "getting a list of mutes", %{conn: conn} do
     user = insert(:user)
     other_user = insert(:user)
index 69d9c5da5517969c885630dd407efd3bbb9d679c..0feaf4b64837ab032214cf33c08fbf383c72f1d6 100644 (file)
@@ -105,8 +105,7 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
       "fields" => [],
       "pleroma" => %{
         "confirmation_pending" => false,
-        "tags" => [],
-        "subscribed" => false
+        "tags" => []
       }
     }
 
@@ -154,8 +153,7 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
       "fields" => [],
       "pleroma" => %{
         "confirmation_pending" => false,
-        "tags" => [],
-        "subscribed" => false
+        "tags" => []
       }
     }
 
@@ -204,22 +202,13 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
       "fields" => [],
       "pleroma" => %{
         "confirmation_pending" => false,
-        "tags" => [],
-        "subscribed" => false
+        "tags" => []
       }
     }
 
     assert represented == UserView.render("show.json", %{user: follower, for: user})
   end
 
-  test "a user that you are subscribed to" do
-    user = insert(:user)
-    subscriber = insert(:user)
-    {:ok, subscriber} = User.subscribe(subscriber, user)
-    represented = UserView.render("show.json", %{user: user, for: subscriber})
-    assert represented["pleroma"]["subscribed"] == true
-  end
-
   test "a user that is a moderator" do
     user = insert(:user, %{info: %{is_moderator: true}})
     represented = UserView.render("show.json", %{user: user, for: user})
@@ -299,8 +288,7 @@ defmodule Pleroma.Web.TwitterAPI.UserViewTest do
       "fields" => [],
       "pleroma" => %{
         "confirmation_pending" => false,
-        "tags" => [],
-        "subscribed" => false
+        "tags" => []
       }
     }