forked from AkkomaGang/akkoma
Merge branch 'fix/self-follow' into 'develop'
Fix self follows to be more intuitive, fix minor websocket channel issue See merge request pleroma/pleroma!26
This commit is contained in:
commit
6900851581
6 changed files with 26 additions and 14 deletions
|
@ -61,8 +61,9 @@ def info_changeset(struct, params \\ %{}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_info(%User{} = user) do
|
def user_info(%User{} = user) do
|
||||||
|
oneself = if user.local, do: 1, else: 0
|
||||||
%{
|
%{
|
||||||
following_count: length(user.following),
|
following_count: length(user.following) - oneself,
|
||||||
note_count: user.info["note_count"] || 0,
|
note_count: user.info["note_count"] || 0,
|
||||||
follower_count: user.info["follower_count"] || 0
|
follower_count: user.info["follower_count"] || 0
|
||||||
}
|
}
|
||||||
|
@ -166,7 +167,7 @@ def follow(%User{} = follower, %User{} = followed) do
|
||||||
|
|
||||||
def unfollow(%User{} = follower, %User{} = followed) do
|
def unfollow(%User{} = follower, %User{} = followed) do
|
||||||
ap_followers = followed.follower_address
|
ap_followers = followed.follower_address
|
||||||
if following?(follower, followed) do
|
if following?(follower, followed) and follower.ap_id != followed.ap_id do
|
||||||
following = follower.following
|
following = follower.following
|
||||||
|> List.delete(ap_followers)
|
|> List.delete(ap_followers)
|
||||||
|
|
||||||
|
@ -285,12 +286,12 @@ def get_notified_from_activity(%Activity{data: %{"to" => to}}) do
|
||||||
|
|
||||||
def get_recipients_from_activity(%Activity{data: %{"to" => to}}) do
|
def get_recipients_from_activity(%Activity{data: %{"to" => to}}) do
|
||||||
query = from u in User,
|
query = from u in User,
|
||||||
where: u.local == true
|
|
||||||
|
|
||||||
query = from u in query,
|
|
||||||
where: u.ap_id in ^to,
|
where: u.ap_id in ^to,
|
||||||
or_where: fragment("? \\\?| ?", u.following, ^to)
|
or_where: fragment("? \\\?| ?", u.following, ^to)
|
||||||
|
|
||||||
|
query = from u in query,
|
||||||
|
where: u.local == true
|
||||||
|
|
||||||
Repo.all(query)
|
Repo.all(query)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ def user_factory do
|
||||||
password_hash: Comeonin.Pbkdf2.hashpwsalt("test"),
|
password_hash: Comeonin.Pbkdf2.hashpwsalt("test"),
|
||||||
bio: sequence(:bio, &"Tester Number #{&1}")
|
bio: sequence(:bio, &"Tester Number #{&1}")
|
||||||
}
|
}
|
||||||
%{ user | ap_id: Pleroma.User.ap_id(user), follower_address: Pleroma.User.ap_followers(user) }
|
%{ user | ap_id: Pleroma.User.ap_id(user), follower_address: Pleroma.User.ap_followers(user), following: [Pleroma.User.ap_id(user)] }
|
||||||
end
|
end
|
||||||
|
|
||||||
def note_factory do
|
def note_factory do
|
||||||
|
|
|
@ -36,7 +36,7 @@ test "follow takes a user and another user" do
|
||||||
followed = User.get_by_ap_id(followed.ap_id)
|
followed = User.get_by_ap_id(followed.ap_id)
|
||||||
assert followed.info["follower_count"] == 1
|
assert followed.info["follower_count"] == 1
|
||||||
|
|
||||||
assert user.following == [User.ap_followers(followed)]
|
assert User.ap_followers(followed) in user.following
|
||||||
end
|
end
|
||||||
|
|
||||||
test "following a remote user will ensure a websub subscription is present" do
|
test "following a remote user will ensure a websub subscription is present" do
|
||||||
|
@ -46,7 +46,7 @@ test "following a remote user will ensure a websub subscription is present" do
|
||||||
assert followed.local == false
|
assert followed.local == false
|
||||||
|
|
||||||
{:ok, user} = User.follow(user, followed)
|
{:ok, user} = User.follow(user, followed)
|
||||||
assert user.following == [User.ap_followers(followed)]
|
assert User.ap_followers(followed) in user.following
|
||||||
|
|
||||||
query = from w in WebsubClientSubscription,
|
query = from w in WebsubClientSubscription,
|
||||||
where: w.topic == ^followed.info["topic"]
|
where: w.topic == ^followed.info["topic"]
|
||||||
|
@ -66,6 +66,15 @@ test "unfollow takes a user and another user" do
|
||||||
assert user.following == []
|
assert user.following == []
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "unfollow doesn't unfollow yourself" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:error, _} = User.unfollow(user, user)
|
||||||
|
|
||||||
|
assert user.following == [user.ap_id]
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
test "test if a user is following another user" do
|
test "test if a user is following another user" do
|
||||||
followed = insert(:user)
|
followed = insert(:user)
|
||||||
user = insert(:user, %{following: [User.ap_followers(followed)]})
|
user = insert(:user, %{following: [User.ap_followers(followed)]})
|
||||||
|
@ -309,6 +318,7 @@ test "get recipients from activity" do
|
||||||
assert [addressed] == User.get_recipients_from_activity(activity)
|
assert [addressed] == User.get_recipients_from_activity(activity)
|
||||||
|
|
||||||
{:ok, user} = User.follow(user, actor)
|
{:ok, user} = User.follow(user, actor)
|
||||||
|
{:ok, user_two} = User.follow(user_two, actor)
|
||||||
recipients = User.get_recipients_from_activity(activity)
|
recipients = User.get_recipients_from_activity(activity)
|
||||||
assert length(recipients) == 2
|
assert length(recipients) == 2
|
||||||
assert user in recipients
|
assert user in recipients
|
||||||
|
|
|
@ -288,7 +288,7 @@ test "with credentials", %{conn: conn, user: current_user} do
|
||||||
|> post("/api/friendships/create.json", %{user_id: followed.id})
|
|> post("/api/friendships/create.json", %{user_id: followed.id})
|
||||||
|
|
||||||
current_user = Repo.get(User, current_user.id)
|
current_user = Repo.get(User, current_user.id)
|
||||||
assert current_user.following == [User.ap_followers(followed)]
|
assert User.ap_followers(followed) in current_user.following
|
||||||
assert json_response(conn, 200) == UserView.render("show.json", %{user: followed, for: current_user})
|
assert json_response(conn, 200) == UserView.render("show.json", %{user: followed, for: current_user})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -304,7 +304,7 @@ test "with credentials", %{conn: conn, user: current_user} do
|
||||||
followed = insert(:user)
|
followed = insert(:user)
|
||||||
|
|
||||||
{:ok, current_user} = User.follow(current_user, followed)
|
{:ok, current_user} = User.follow(current_user, followed)
|
||||||
assert current_user.following == [User.ap_followers(followed)]
|
assert User.ap_followers(followed) in current_user.following
|
||||||
ActivityPub.follow(current_user, followed)
|
ActivityPub.follow(current_user, followed)
|
||||||
|
|
||||||
conn = conn
|
conn = conn
|
||||||
|
@ -312,7 +312,7 @@ test "with credentials", %{conn: conn, user: current_user} do
|
||||||
|> post("/api/friendships/destroy.json", %{user_id: followed.id})
|
|> post("/api/friendships/destroy.json", %{user_id: followed.id})
|
||||||
|
|
||||||
current_user = Repo.get(User, current_user.id)
|
current_user = Repo.get(User, current_user.id)
|
||||||
assert current_user.following == []
|
assert current_user.following == [current_user.ap_id]
|
||||||
assert json_response(conn, 200) == UserView.render("show.json", %{user: followed, for: current_user})
|
assert json_response(conn, 200) == UserView.render("show.json", %{user: followed, for: current_user})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -179,7 +179,7 @@ test "Follow another user using user_id" do
|
||||||
followed = insert(:user)
|
followed = insert(:user)
|
||||||
|
|
||||||
{:ok, user, followed, _activity } = TwitterAPI.follow(user, %{"user_id" => followed.id})
|
{:ok, user, followed, _activity } = TwitterAPI.follow(user, %{"user_id" => followed.id})
|
||||||
assert user.following == [User.ap_followers(followed)]
|
assert User.ap_followers(followed) in user.following
|
||||||
|
|
||||||
{ :error, msg } = TwitterAPI.follow(user, %{"user_id" => followed.id})
|
{ :error, msg } = TwitterAPI.follow(user, %{"user_id" => followed.id})
|
||||||
assert msg == "Could not follow user: #{followed.nickname} is already on your list."
|
assert msg == "Could not follow user: #{followed.nickname} is already on your list."
|
||||||
|
@ -190,7 +190,7 @@ test "Follow another user using screen_name" do
|
||||||
followed = insert(:user)
|
followed = insert(:user)
|
||||||
|
|
||||||
{:ok, user, followed, _activity } = TwitterAPI.follow(user, %{"screen_name" => followed.nickname})
|
{:ok, user, followed, _activity } = TwitterAPI.follow(user, %{"screen_name" => followed.nickname})
|
||||||
assert user.following == [User.ap_followers(followed)]
|
assert User.ap_followers(followed) in user.following
|
||||||
|
|
||||||
followed = User.get_by_ap_id(followed.ap_id)
|
followed = User.get_by_ap_id(followed.ap_id)
|
||||||
assert followed.info["follower_count"] == 1
|
assert followed.info["follower_count"] == 1
|
||||||
|
|
|
@ -92,7 +92,8 @@ test "A user for a given other follower", %{user: user} do
|
||||||
end
|
end
|
||||||
|
|
||||||
test "A user that follows you", %{user: user} do
|
test "A user that follows you", %{user: user} do
|
||||||
{:ok, follower} = UserBuilder.insert(%{following: [User.ap_followers(user)]})
|
follower = insert(:user)
|
||||||
|
{:ok, follower} = User.follow(follower, user)
|
||||||
{:ok, user} = User.update_follower_count(user)
|
{:ok, user} = User.update_follower_count(user)
|
||||||
image = "https://placehold.it/48x48"
|
image = "https://placehold.it/48x48"
|
||||||
represented = %{
|
represented = %{
|
||||||
|
|
Loading…
Reference in a new issue