Subscribe to remote users on following.
authorRoger Braun <roger@rogerbraun.net>
Sat, 6 May 2017 12:09:39 +0000 (14:09 +0200)
committerRoger Braun <roger@rogerbraun.net>
Sat, 6 May 2017 12:09:39 +0000 (14:09 +0200)
lib/pleroma/user.ex
lib/pleroma/web/websub/websub.ex
test/user_test.exs

index 23be6276ebe6abce6bffa9567d4c5a7d6225b600..551c23445067b6e73f2dd2ef3e406ca14df5a7aa 100644 (file)
@@ -4,7 +4,7 @@ defmodule Pleroma.User do
   import Ecto.{Changeset, Query}
   alias Pleroma.{Repo, User, Object, Web}
   alias Comeonin.Pbkdf2
-  alias Pleroma.Web.OStatus
+  alias Pleroma.Web.{OStatus, Websub}
 
   schema "users" do
     field :bio, :string
@@ -88,6 +88,10 @@ defmodule Pleroma.User do
       {:error,
        "Could not follow user: #{followed.nickname} is already on your list."}
     else
+      if !followed.local do
+        Websub.subscribe(follower, followed)
+      end
+
       following = [ap_followers | follower.following]
       |> Enum.uniq
 
index a5abc303c1feb1e2f533b13a863d3fa3664ad6f1..7c8efa917f169182887119d6094c5c050e0167dc 100644 (file)
@@ -126,7 +126,7 @@ defmodule Pleroma.Web.Websub do
     topic = subscribed.info["topic"]
     # FIXME: Race condition, use transactions
     {:ok, subscription} = with subscription when not is_nil(subscription) <- Repo.get_by(WebsubClientSubscription, topic: topic) do
-      subscribers = [subscriber.ap_id, subscription.subscribers] |> Enum.uniq
+      subscribers = [subscriber.ap_id | subscription.subscribers] |> Enum.uniq
       change = Ecto.Changeset.change(subscription, %{subscribers: subscribers})
       Repo.update(change)
     else _e ->
index 036e70dff3cfec9b29db568e4d860a0e925d99c5..417282ff9d32df9018f7329ecd7ac0bf164156b0 100644 (file)
@@ -1,9 +1,12 @@
 defmodule Pleroma.UserTest do
   alias Pleroma.Builders.UserBuilder
-  alias Pleroma.User
+  alias Pleroma.{User, Repo}
+  alias Pleroma.Web.OStatus
+  alias Pleroma.Web.Websub.WebsubClientSubscription
   use Pleroma.DataCase
 
   import Pleroma.Factory
+  import Ecto.Query
 
   test "ap_id returns the activity pub id for the user" do
     host =
@@ -30,13 +33,29 @@ defmodule Pleroma.UserTest do
     user = insert(:user)
     followed = insert(:user)
 
-    {:ok, user } = User.follow(user, followed)
+    {:ok, user} = User.follow(user, followed)
 
     user = Repo.get(User, user.id)
 
     assert user.following == [User.ap_followers(followed)]
   end
 
+  test "following a remote user will ensure a websub subscription is present" do
+    user = insert(:user)
+    {:ok, followed} = OStatus.make_user("shp@social.heldscal.la")
+
+    assert followed.local == false
+
+    {:ok, user} = User.follow(user, followed)
+    assert user.following == [User.ap_followers(followed)]
+
+    query = from w in WebsubClientSubscription,
+    where: w.topic == ^followed.info["topic"]
+    websub = Repo.one(query)
+
+    assert websub
+  end
+
   test "unfollow takes a user and another user" do
     followed = insert(:user)
     user = insert(:user, %{following: [User.ap_followers(followed)]})
@@ -95,7 +114,6 @@ defmodule Pleroma.UserTest do
       assert user == fetched_user
     end
 
-    # TODO: Make the test local.
     test "fetches an external user via ostatus if no user exists" do
       fetched_user = User.get_or_fetch_by_nickname("shp@social.heldscal.la")
       assert fetched_user.nickname == "shp@social.heldscal.la"