Use sql query in User.get_follow_requests/1 for filtering logic
authoreugenijm <eugenijm@protonmail.com>
Sat, 2 Mar 2019 19:18:51 +0000 (22:18 +0300)
committereugenijm <eugenijm@protonmail.com>
Sat, 2 Mar 2019 19:18:56 +0000 (22:18 +0300)
lib/pleroma/user.ex
test/user_test.exs

index d58274508afa1e601edb0e7da170a79725f169af..06b430ccde048cb89462d328c91f0f8e35f1b650 100644 (file)
@@ -648,15 +648,14 @@ defmodule Pleroma.User do
   end
 
   def get_follow_requests(%User{} = user) do
-    q = get_follow_requests_query(user)
-    reqs = Repo.all(q)
-
     users =
-      Enum.map(reqs, fn req -> req.actor end)
-      |> Enum.uniq()
-      |> Enum.map(fn ap_id -> get_by_ap_id(ap_id) end)
-      |> Enum.filter(fn u -> !is_nil(u) end)
-      |> Enum.filter(fn u -> !following?(u, user) end)
+      user
+      |> User.get_follow_requests_query()
+      |> join(:inner, [a], u in User, a.actor == u.ap_id)
+      |> where([a, u], not fragment("? @> ?", u.following, ^[user.follower_address]))
+      |> group_by([a, u], u.id)
+      |> select([a, u], u)
+      |> Repo.all()
 
     {:ok, users}
   end
index cbe4693fc2cbdac62956356be943bed9a3b59f71..b8d41ecfd8407da1a416b2ce4e230b9ef8db02aa 100644 (file)
@@ -64,6 +64,20 @@ defmodule Pleroma.UserTest do
     assert activity
   end
 
+  test "doesn't return already accepted or duplicate follow requests" do
+    locked = insert(:user, %{info: %{locked: true}})
+    pending_follower = insert(:user)
+    accepted_follower = insert(:user)
+
+    Pleroma.Web.TwitterAPI.TwitterAPI.follow(pending_follower, %{"user_id" => locked.id})
+    Pleroma.Web.TwitterAPI.TwitterAPI.follow(pending_follower, %{"user_id" => locked.id})
+    Pleroma.Web.TwitterAPI.TwitterAPI.follow(accepted_follower, %{"user_id" => locked.id})
+    User.maybe_follow(accepted_follower, locked)
+
+    assert {:ok, [activity]} = User.get_follow_requests(locked)
+    assert activity
+  end
+
   test "follow_all follows mutliple users" do
     user = insert(:user)
     followed_zero = insert(:user)