Queue individual jobs for each user that needs to be deleted when deleting an instance.
This commit is contained in:
parent
9be542e272
commit
56aab905e8
4 changed files with 49 additions and 15 deletions
1
changelog.d/delete-instance.change
Normal file
1
changelog.d/delete-instance.change
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Deleting an instance queues individual jobs for each user that needs to be deleted from the server.
|
||||||
|
|
@ -9,7 +9,6 @@ defmodule Pleroma.Instances.Instance do
|
||||||
alias Pleroma.Instances.Instance
|
alias Pleroma.Instances.Instance
|
||||||
alias Pleroma.Maps
|
alias Pleroma.Maps
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.User
|
|
||||||
alias Pleroma.Workers.DeleteWorker
|
alias Pleroma.Workers.DeleteWorker
|
||||||
|
|
||||||
use Ecto.Schema
|
use Ecto.Schema
|
||||||
|
|
@ -300,16 +299,4 @@ defmodule Pleroma.Instances.Instance do
|
||||||
DeleteWorker.new(%{"op" => "delete_instance", "host" => host})
|
DeleteWorker.new(%{"op" => "delete_instance", "host" => host})
|
||||||
|> Oban.insert()
|
|> Oban.insert()
|
||||||
end
|
end
|
||||||
|
|
||||||
def perform(:delete_instance, host) when is_binary(host) do
|
|
||||||
User.Query.build(%{nickname: "@#{host}"})
|
|
||||||
|> Repo.chunk_stream(100, :batches)
|
|
||||||
|> Stream.each(fn users ->
|
|
||||||
users
|
|
||||||
|> Enum.each(fn user ->
|
|
||||||
User.perform(:delete, user)
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
|> Stream.run()
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
defmodule Pleroma.Workers.DeleteWorker do
|
defmodule Pleroma.Workers.DeleteWorker do
|
||||||
alias Pleroma.Instances.Instance
|
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
|
|
||||||
use Oban.Worker, queue: :slow
|
use Oban.Worker, queue: :slow
|
||||||
|
|
@ -15,7 +14,15 @@ defmodule Pleroma.Workers.DeleteWorker do
|
||||||
end
|
end
|
||||||
|
|
||||||
def perform(%Job{args: %{"op" => "delete_instance", "host" => host}}) do
|
def perform(%Job{args: %{"op" => "delete_instance", "host" => host}}) do
|
||||||
Instance.perform(:delete_instance, host)
|
Pleroma.Repo.transaction(fn ->
|
||||||
|
User.Query.build(%{nickname: "@#{host}"})
|
||||||
|
|> Pleroma.Repo.all()
|
||||||
|
|> Enum.each(fn user ->
|
||||||
|
%{"op" => "delete_user", "user_id" => user.id}
|
||||||
|
|> __MODULE__.new()
|
||||||
|
|> Oban.insert()
|
||||||
|
end)
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
|
|
|
||||||
39
test/pleroma/workers/delete_worker_test.exs
Normal file
39
test/pleroma/workers/delete_worker_test.exs
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Workers.DeleteWorkerTest do
|
||||||
|
use Pleroma.DataCase, async: true
|
||||||
|
use Oban.Testing, repo: Pleroma.Repo
|
||||||
|
|
||||||
|
import Pleroma.Factory
|
||||||
|
|
||||||
|
alias Pleroma.Instances.Instance
|
||||||
|
alias Pleroma.Tests.ObanHelpers
|
||||||
|
alias Pleroma.Workers.DeleteWorker
|
||||||
|
|
||||||
|
describe "instance deletion" do
|
||||||
|
test "creates individual Oban jobs for each user when deleting an instance" do
|
||||||
|
user1 = insert(:user, nickname: "alice@example.com", name: "Alice")
|
||||||
|
user2 = insert(:user, nickname: "bob@example.com", name: "Bob")
|
||||||
|
|
||||||
|
{:ok, job} = Instance.delete_users_and_activities("example.com")
|
||||||
|
|
||||||
|
assert_enqueued(
|
||||||
|
worker: DeleteWorker,
|
||||||
|
args: %{"op" => "delete_instance", "host" => "example.com"}
|
||||||
|
)
|
||||||
|
|
||||||
|
{:ok, :ok} = ObanHelpers.perform(job)
|
||||||
|
|
||||||
|
delete_user_jobs = all_enqueued(worker: DeleteWorker, args: %{"op" => "delete_user"})
|
||||||
|
|
||||||
|
assert length(delete_user_jobs) == 2
|
||||||
|
|
||||||
|
user_ids = [user1.id, user2.id]
|
||||||
|
job_user_ids = Enum.map(delete_user_jobs, fn job -> job.args["user_id"] end)
|
||||||
|
|
||||||
|
assert Enum.sort(user_ids) == Enum.sort(job_user_ids)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Add table
Add a link
Reference in a new issue