Commit bda389d7 authored by lain's avatar lain
Browse files

Subscribe to remote users on following.

parent 9cafb67f
......@@ -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
"Could not follow user: #{followed.nickname} is already on your list."}
if !followed.local do
Websub.subscribe(follower, followed)
following = [ap_followers | follower.following]
|> Enum.uniq
......@@ -126,7 +126,7 @@ def subscribe(subscriber, subscribed, requester \\ &request_subscription/1) do
topic =["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})
else _e ->
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,
assert user.following == [User.ap_followers(followed)]
test "following a remote user will ensure a websub subscription is present" do
user = insert(:user)
{:ok, followed} = OStatus.make_user("")
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 == ^["topic"]
websub =
assert websub
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
# 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("")
assert fetched_user.nickname == ""
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment