diff options
author | lain <lain@soykaf.club> | 2019-01-30 19:33:25 +0100 |
---|---|---|
committer | lain <lain@soykaf.club> | 2019-01-30 19:33:25 +0100 |
commit | 47ec690c54d8af9e317217990fb0756c7d37e2a5 (patch) | |
tree | d8a7615a976cabf34ce74d92b5fb33b582cca5ab /lib | |
parent | 935e65e2613d29d065166ba4605ee14349b74c53 (diff) | |
download | pleroma-47ec690c54d8af9e317217990fb0756c7d37e2a5.tar.gz pleroma-47ec690c54d8af9e317217990fb0756c7d37e2a5.zip |
Use race-condition free mass follow.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/user.ex | 17 |
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 |