summaryrefslogtreecommitdiff
path: root/priv/repo/migrations
diff options
context:
space:
mode:
authorEgor Kislitsyn <egor@kislitsyn.com>2020-05-05 14:28:54 +0400
committerEgor Kislitsyn <egor@kislitsyn.com>2020-05-05 14:28:54 +0400
commitdecaa64f75f8bd69622fa5fba757f99719f09808 (patch)
tree52d3bfc7318230beae31865c7f0a12e02b7f68b5 /priv/repo/migrations
parent764b4f95a8e9e751d5a6136fc2be44d61a082443 (diff)
parentc297667f16db40654bb16608c01dc4a2dc7c0e4b (diff)
downloadpleroma-decaa64f75f8bd69622fa5fba757f99719f09808.tar.gz
pleroma-decaa64f75f8bd69622fa5fba757f99719f09808.zip
Merge branch 'develop' into global-status-expiration
Diffstat (limited to 'priv/repo/migrations')
-rw-r--r--priv/repo/migrations/20200428221338_insert_skeletons_for_deleted_users.exs45
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