diff options
Diffstat (limited to 'priv')
6 files changed, 81 insertions, 125 deletions
diff --git a/priv/repo/migrations/20191108161911_create_user_blocks.exs b/priv/repo/migrations/20191108161911_create_user_blocks.exs deleted file mode 100644 index c882d2bd6..000000000 --- a/priv/repo/migrations/20191108161911_create_user_blocks.exs +++ /dev/null @@ -1,14 +0,0 @@ -defmodule Pleroma.Repo.Migrations.CreateUserBlocks do - use Ecto.Migration - - def change do - create_if_not_exists table(:user_blocks) do - add(:blocker_id, references(:users, type: :uuid, on_delete: :delete_all)) - add(:blockee_id, references(:users, type: :uuid, on_delete: :delete_all)) - - timestamps(updated_at: false) - end - - create_if_not_exists(unique_index(:user_blocks, [:blocker_id, :blockee_id])) - end -end diff --git a/priv/repo/migrations/20191108173911_data_migration_populate_user_blocks.exs b/priv/repo/migrations/20191108173911_data_migration_populate_user_blocks.exs deleted file mode 100644 index fe537679d..000000000 --- a/priv/repo/migrations/20191108173911_data_migration_populate_user_blocks.exs +++ /dev/null @@ -1,49 +0,0 @@ -defmodule Pleroma.Repo.Migrations.DataMigrationPopulateUserBlocks do - use Ecto.Migration - - alias Ecto.Adapters.SQL - alias Pleroma.Repo - - require Logger - - def up do - {:ok, %{rows: block_rows}} = - SQL.query(Repo, "SELECT id, blocks FROM users WHERE blocks != '{}'") - - blockee_ap_ids = - Enum.flat_map( - block_rows, - fn [_, ap_ids] -> ap_ids end - ) - |> Enum.uniq() - - # Selecting ids of all blockees at once in order to reduce the number of SELECT queries - {:ok, %{rows: blockee_ap_id_id}} = - SQL.query(Repo, "SELECT ap_id, id FROM users WHERE ap_id = ANY($1)", [blockee_ap_ids]) - - blockee_id_by_ap_id = Enum.into(blockee_ap_id_id, %{}, fn [k, v] -> {k, v} end) - - Enum.each( - block_rows, - fn [blocker_id, blockee_ap_ids] -> - blocker_uuid = Ecto.UUID.cast!(blocker_id) - - for blockee_ap_id <- blockee_ap_ids do - blockee_id = blockee_id_by_ap_id[blockee_ap_id] - - with {:ok, blockee_uuid} <- blockee_id && Ecto.UUID.cast(blockee_id) do - execute( - "INSERT INTO user_blocks(blocker_id, blockee_id, inserted_at) " <> - "VALUES('#{blocker_uuid}'::uuid, '#{blockee_uuid}'::uuid, now()) " <> - "ON CONFLICT (blocker_id, blockee_id) DO NOTHING" - ) - else - _ -> Logger.warn("Missing reference: (#{blocker_uuid}, #{blockee_id})") - end - end - end - ) - end - - def down, do: :noop -end diff --git a/priv/repo/migrations/20191112151559_create_user_mutes.exs b/priv/repo/migrations/20191112151559_create_user_mutes.exs deleted file mode 100644 index eaa285de2..000000000 --- a/priv/repo/migrations/20191112151559_create_user_mutes.exs +++ /dev/null @@ -1,14 +0,0 @@ -defmodule Pleroma.Repo.Migrations.CreateUserMutes do - use Ecto.Migration - - def change do - create_if_not_exists table(:user_mutes) do - add(:muter_id, references(:users, type: :uuid, on_delete: :delete_all)) - add(:mutee_id, references(:users, type: :uuid, on_delete: :delete_all)) - - timestamps(updated_at: false) - end - - create_if_not_exists(unique_index(:user_mutes, [:muter_id, :mutee_id])) - end -end diff --git a/priv/repo/migrations/20191112151614_data_migration_populate_user_mutes.exs b/priv/repo/migrations/20191112151614_data_migration_populate_user_mutes.exs deleted file mode 100644 index a8bdd072e..000000000 --- a/priv/repo/migrations/20191112151614_data_migration_populate_user_mutes.exs +++ /dev/null @@ -1,48 +0,0 @@ -defmodule Pleroma.Repo.Migrations.DataMigrationPopulateUserMutes do - use Ecto.Migration - - alias Ecto.Adapters.SQL - alias Pleroma.Repo - - require Logger - - def up do - {:ok, %{rows: mute_rows}} = SQL.query(Repo, "SELECT id, mutes FROM users WHERE mutes != '{}'") - - mutee_ap_ids = - Enum.flat_map( - mute_rows, - fn [_, ap_ids] -> ap_ids end - ) - |> Enum.uniq() - - # Selecting ids of all mutees at once in order to reduce the number of SELECT queries - {:ok, %{rows: mutee_ap_id_id}} = - SQL.query(Repo, "SELECT ap_id, id FROM users WHERE ap_id = ANY($1)", [mutee_ap_ids]) - - mutee_id_by_ap_id = Enum.into(mutee_ap_id_id, %{}, fn [k, v] -> {k, v} end) - - Enum.each( - mute_rows, - fn [muter_id, mutee_ap_ids] -> - muter_uuid = Ecto.UUID.cast!(muter_id) - - for mutee_ap_id <- mutee_ap_ids do - mutee_id = mutee_id_by_ap_id[mutee_ap_id] - - with {:ok, mutee_uuid} <- mutee_id && Ecto.UUID.cast(mutee_id) do - execute( - "INSERT INTO user_mutes(muter_id, mutee_id, inserted_at) " <> - "VALUES('#{muter_uuid}'::uuid, '#{mutee_uuid}'::uuid, now()) " <> - "ON CONFLICT (muter_id, mutee_id) DO NOTHING" - ) - else - _ -> Logger.warn("Missing reference: (#{muter_uuid}, #{mutee_id})") - end - end - end - ) - end - - def down, do: :noop -end diff --git a/priv/repo/migrations/20191118084425_create_user_relationships.exs b/priv/repo/migrations/20191118084425_create_user_relationships.exs new file mode 100644 index 000000000..c281f887d --- /dev/null +++ b/priv/repo/migrations/20191118084425_create_user_relationships.exs @@ -0,0 +1,17 @@ +defmodule Pleroma.Repo.Migrations.CreateUserRelationships do + use Ecto.Migration + + def change do + create_if_not_exists table(:user_relationships) do + add(:source_id, references(:users, type: :uuid, on_delete: :delete_all)) + add(:target_id, references(:users, type: :uuid, on_delete: :delete_all)) + add(:relationship_type, :integer, null: false) + + timestamps(updated_at: false) + end + + create_if_not_exists( + unique_index(:user_relationships, [:source_id, :relationship_type, :target_id]) + ) + end +end diff --git a/priv/repo/migrations/20191118084500_data_migration_populate_user_relationships.exs b/priv/repo/migrations/20191118084500_data_migration_populate_user_relationships.exs new file mode 100644 index 000000000..f8dde7626 --- /dev/null +++ b/priv/repo/migrations/20191118084500_data_migration_populate_user_relationships.exs @@ -0,0 +1,64 @@ +defmodule Pleroma.Repo.Migrations.DataMigrationPopulateUserRelationships do + use Ecto.Migration + + alias Ecto.Adapters.SQL + alias Pleroma.Repo + + require Logger + + def up do + Enum.each( + [blocks: 1, mutes: 2, muted_reblogs: 3, muted_notifications: 4], + fn {field, relationship_type_code} -> + migrate(field, relationship_type_code) + end + ) + end + + def down, do: :noop + + defp migrate(field, relationship_type_code) do + Logger.info("Processing users.#{field}...") + + {:ok, %{rows: field_rows}} = + SQL.query(Repo, "SELECT id, #{field} FROM users WHERE #{field} != '{}'") + + target_ap_ids = + Enum.flat_map( + field_rows, + fn [_, ap_ids] -> ap_ids end + ) + |> Enum.uniq() + + # Selecting ids of all targets at once in order to reduce the number of SELECT queries + {:ok, %{rows: target_ap_id_id}} = + SQL.query(Repo, "SELECT ap_id, id FROM users WHERE ap_id = ANY($1)", [target_ap_ids]) + + target_id_by_ap_id = Enum.into(target_ap_id_id, %{}, fn [k, v] -> {k, v} end) + + Enum.each( + field_rows, + fn [source_id, target_ap_ids] -> + source_uuid = Ecto.UUID.cast!(source_id) + + for target_ap_id <- target_ap_ids do + target_id = target_id_by_ap_id[target_ap_id] + + with {:ok, target_uuid} <- target_id && Ecto.UUID.cast(target_id) do + execute(""" + INSERT INTO user_relationships( + source_id, target_id, relationship_type, inserted_at + ) + VALUES( + '#{source_uuid}'::uuid, '#{target_uuid}'::uuid, #{relationship_type_code}, now() + ) + ON CONFLICT (source_id, relationship_type, target_id) DO NOTHING + """) + else + _ -> Logger.warn("Unresolved #{field} reference: (#{source_uuid}, #{target_id})") + end + end + end + ) + end +end |