diff options
Diffstat (limited to 'priv/repo/migrations')
| -rw-r--r-- | priv/repo/migrations/20200428221338_insert_skeletons_for_deleted_users.exs | 45 | 
1 files changed, 45 insertions, 0 deletions
| diff --git a/priv/repo/migrations/20200428221338_insert_skeletons_for_deleted_users.exs b/priv/repo/migrations/20200428221338_insert_skeletons_for_deleted_users.exs new file mode 100644 index 000000000..11d9a70ba --- /dev/null +++ b/priv/repo/migrations/20200428221338_insert_skeletons_for_deleted_users.exs @@ -0,0 +1,45 @@ +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 where local = true))) 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 | 
