diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 23be6276e..551c23445 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -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 @@ def follow(%User{} = follower, %User{} = followed) 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 diff --git a/lib/pleroma/web/websub/websub.ex b/lib/pleroma/web/websub/websub.ex index a5abc303c..7c8efa917 100644 --- a/lib/pleroma/web/websub/websub.ex +++ b/lib/pleroma/web/websub/websub.ex @@ -126,7 +126,7 @@ def subscribe(subscriber, subscribed, requester \\ &request_subscription/1) 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 -> diff --git a/test/user_test.exs b/test/user_test.exs index 036e70dff..417282ff9 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -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 @@ test "follow takes a user and another user" 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 @@ test "gets an existing user" 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"