Skip to content
Snippets Groups Projects
Commit bda389d7 authored by lain's avatar lain
Browse files

Subscribe to remote users on following.

parent 9cafb67f
Branches
No related tags found
No related merge requests found
......@@ -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
......
......@@ -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 ->
......
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"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment