summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorlain <lain@soykaf.club>2019-01-30 19:33:25 +0100
committerlain <lain@soykaf.club>2019-01-30 19:33:25 +0100
commit47ec690c54d8af9e317217990fb0756c7d37e2a5 (patch)
treed8a7615a976cabf34ce74d92b5fb33b582cca5ab /lib
parent935e65e2613d29d065166ba4605ee14349b74c53 (diff)
downloadpleroma-47ec690c54d8af9e317217990fb0756c7d37e2a5.tar.gz
pleroma-47ec690c54d8af9e317217990fb0756c7d37e2a5.zip
Use race-condition free mass follow.
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/user.ex17
1 files changed, 9 insertions, 8 deletions
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index 62a4a3db1..bd797db40 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -309,20 +309,21 @@ defmodule Pleroma.User do
@doc "A mass follow for local users. Ignores blocks and has no side effects"
@spec follow_all(User.t(), list(User.t())) :: {atom(), User.t()}
def follow_all(follower, followeds) do
- following =
- (follower.following ++ Enum.map(followeds, fn %{follower_address: fa} -> fa end))
- |> Enum.uniq()
+ followed_addresses = Enum.map(followeds, fn %{follower_address: fa} -> fa end)
+
+ q =
+ from(u in User,
+ where: u.id == ^follower.id,
+ update: [set: [following: fragment("array_cat(?, ?)", u.following, ^followed_addresses)]]
+ )
- {:ok, follower} =
- follower
- |> follow_changeset(%{following: following})
- |> update_and_set_cache
+ {1, [follower]} = Repo.update_all(q, [], returning: true)
Enum.each(followeds, fn followed ->
update_follower_count(followed)
end)
- {:ok, follower}
+ set_cache(follower)
end
def follow(%User{} = follower, %User{info: info} = followed) do