summaryrefslogtreecommitdiff
path: root/priv/repo/migrations/20191008132217_migrate_following_relationships.exs
diff options
context:
space:
mode:
authorEgor Kislitsyn <egor@kislitsyn.com>2019-10-08 20:27:42 +0700
committerEgor Kislitsyn <egor@kislitsyn.com>2019-10-08 20:27:42 +0700
commit761ad0b48e552e7b199fe1a624e3d03aa91981a3 (patch)
tree6d9956f8e0dae7f0eb6ba60facb5369b7c22e55e /priv/repo/migrations/20191008132217_migrate_following_relationships.exs
parent6291eaa5902d5c1565e8969117fdf92c373716b6 (diff)
downloadpleroma-761ad0b48e552e7b199fe1a624e3d03aa91981a3.tar.gz
pleroma-761ad0b48e552e7b199fe1a624e3d03aa91981a3.zip
Split CreateFollowingRelationships to multiple migrations
Diffstat (limited to 'priv/repo/migrations/20191008132217_migrate_following_relationships.exs')
-rw-r--r--priv/repo/migrations/20191008132217_migrate_following_relationships.exs89
1 files changed, 89 insertions, 0 deletions
diff --git a/priv/repo/migrations/20191008132217_migrate_following_relationships.exs b/priv/repo/migrations/20191008132217_migrate_following_relationships.exs
new file mode 100644
index 000000000..7f996f5a5
--- /dev/null
+++ b/priv/repo/migrations/20191008132217_migrate_following_relationships.exs
@@ -0,0 +1,89 @@
+defmodule Pleroma.Repo.Migrations.MigrateFollowingRelationships do
+ use Ecto.Migration
+
+ def change do
+ execute(import_following_from_users(), "")
+ execute(import_following_from_activities(), restore_following_column())
+ end
+
+ defp import_following_from_users do
+ """
+ INSERT INTO following_relationships (follower_id, following_id, state, inserted_at, updated_at)
+ SELECT
+ relations.follower_id,
+ following.id,
+ 'accept',
+ now(),
+ now()
+ FROM (
+ SELECT
+ users.id AS follower_id,
+ unnest(users.following) AS following_ap_id
+ FROM
+ users
+ WHERE
+ users.following != '{}'
+ AND users.local = false OR users.local = true AND users.email IS NOT NULL -- Exclude `internal/fetch` and `relay`
+ ) AS relations
+ JOIN users AS "following" ON "following".follower_address = relations.following_ap_id
+
+ WHERE relations.follower_id != following.id
+ ON CONFLICT DO NOTHING
+ """
+ end
+
+ defp import_following_from_activities do
+ """
+ INSERT INTO
+ following_relationships (
+ follower_id,
+ following_id,
+ state,
+ inserted_at,
+ updated_at
+ )
+ SELECT
+ followers.id,
+ following.id,
+ activities.data ->> 'state',
+ (activities.data ->> 'published') :: timestamp,
+ now()
+ FROM
+ activities
+ JOIN users AS followers ON (activities.actor = followers.ap_id)
+ JOIN users AS following ON (activities.data ->> 'object' = following.ap_id)
+ WHERE
+ activities.data ->> 'type' = 'Follow'
+ AND activities.data ->> 'state' IN ('accept', 'pending', 'reject')
+ ORDER BY activities.updated_at DESC
+ ON CONFLICT DO NOTHING
+ """
+ end
+
+ defp restore_following_column do
+ """
+ UPDATE
+ users
+ SET
+ following = following_query.following_array,
+ updated_at = now()
+ FROM (
+ SELECT
+ follwer.id AS follower_id,
+ CASE follwer.local
+ WHEN TRUE THEN
+ array_prepend(follwer.follower_address, array_agg(following.follower_address))
+ ELSE
+ array_agg(following.follower_address)
+ END AS following_array
+ FROM
+ following_relationships
+ JOIN users AS follwer ON follwer.id = following_relationships.follower_id
+ JOIN users AS FOLLOWING ON following.id = following_relationships.following_id
+ GROUP BY
+ follwer.id) AS following_query
+ WHERE
+ following_query.follower_id = users.id
+ """
+ end
+end