Apparently some instances have local users with local ap_ids that are marked as local: false. Needs more investigation into how that happened. In the meantime, the skeleton migration was patched to just ignore all known ap ids, not just locals. Doesn't seem to slow down the migration too much on patch.cx Closes #1746
45 lines
1.3 KiB
Elixir
45 lines
1.3 KiB
Elixir
defmodule Pleroma.Repo.Migrations.InsertSkeletonsForDeletedUsers do
|
|
use Ecto.Migration
|
|
|
|
alias Pleroma.User
|
|
alias Pleroma.Repo
|
|
|
|
import Ecto.Query
|
|
|
|
def change do
|
|
Application.ensure_all_started(:flake_id)
|
|
|
|
local_ap_id =
|
|
User.Query.build(%{local: true})
|
|
|> select([u], u.ap_id)
|
|
|> limit(1)
|
|
|> Repo.one()
|
|
|
|
unless local_ap_id == nil do
|
|
# Hack to get instance base url because getting it from Phoenix
|
|
# would require starting the whole application
|
|
instance_uri =
|
|
local_ap_id
|
|
|> URI.parse()
|
|
|> Map.put(:query, nil)
|
|
|> Map.put(:path, nil)
|
|
|> URI.to_string()
|
|
|
|
{:ok, %{rows: ap_ids}} =
|
|
Ecto.Adapters.SQL.query(
|
|
Repo,
|
|
"select distinct unnest(nonexistent_locals.recipients) from activities, lateral (select array_agg(recipient) as recipients from unnest(activities.recipients) as recipient where recipient similar to '#{
|
|
instance_uri
|
|
}/users/[A-Za-z0-9]*' and not(recipient in (select ap_id from users))) nonexistent_locals;",
|
|
[],
|
|
timeout: :infinity
|
|
)
|
|
|
|
ap_ids
|
|
|> Enum.each(fn [ap_id] ->
|
|
Ecto.Changeset.change(%User{}, deactivated: true, ap_id: ap_id)
|
|
|> Repo.insert()
|
|
end)
|
|
end
|
|
end
|
|
end
|