Use PhilomenaQuery.Batch for UserWipe

This commit is contained in:
Liam 2025-02-05 14:01:25 -05:00
parent bba88626f6
commit ecd0cb8958

View file

@ -13,6 +13,7 @@ defmodule Philomena.UserWipe do
alias Philomena.Users
alias Philomena.Users.User
alias Philomena.Repo
alias PhilomenaQuery.Batch
import Ecto.Query
def perform(user_id) do
@ -23,7 +24,8 @@ defmodule Philomena.UserWipe do
for schema <- [Comment, Image, Post, Report, SourceChange, TagChange] do
schema
|> where(user_id: ^user.id)
|> in_batches(&Repo.update_all(&1, set: [ip: @wipe_ip, fingerprint: @wipe_fp]))
|> Batch.query_batches()
|> Enum.each(&Repo.update_all(&1, set: [ip: @wipe_ip, fingerprint: @wipe_fp]))
end
UserIp
@ -38,34 +40,4 @@ defmodule Philomena.UserWipe do
|> where(id: ^user.id)
|> Repo.update_all(set: [email: "deactivated#{random_hex}@example.com"])
end
defp in_batches(queryable, mapper) do
queryable = order_by(queryable, asc: :id)
ids =
queryable
|> select([q], q.id)
|> limit(1000)
|> Repo.all()
in_batches(queryable, mapper, 1000, ids)
end
defp in_batches(_queryable, _mapper, _batch_size, []), do: nil
defp in_batches(queryable, mapper, batch_size, ids) do
queryable
|> where([q], q.id in ^ids)
|> exclude(:order_by)
|> mapper.()
ids =
queryable
|> where([q], q.id > ^Enum.max(ids))
|> select([q], q.id)
|> limit(^batch_size)
|> Repo.all()
in_batches(queryable, mapper, batch_size, ids)
end
end