20191009154608_copy_users_info_fields_to_users.exs (3443B)
- # Pleroma: A lightweight social networking server
- # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
- # SPDX-License-Identifier: AGPL-3.0-only
- defmodule Pleroma.Repo.Migrations.CopyUsersInfoFieldsToUsers do
- use Ecto.Migration
- @jsonb_array_default "'[]'::jsonb"
- @info_fields [
- :banner,
- :background,
- :source_data,
- :note_count,
- :follower_count,
- :following_count,
- :locked,
- :confirmation_pending,
- :password_reset_pending,
- :confirmation_token,
- :default_scope,
- :blocks,
- :domain_blocks,
- :mutes,
- :muted_reblogs,
- :muted_notifications,
- :subscribers,
- :deactivated,
- :no_rich_text,
- :ap_enabled,
- :is_moderator,
- :is_admin,
- :show_role,
- :settings,
- :magic_key,
- :uri,
- :hide_followers_count,
- :hide_follows_count,
- :hide_followers,
- :hide_follows,
- :hide_favorites,
- :unread_conversation_count,
- :pinned_activities,
- :email_notifications,
- :mascot,
- :emoji,
- :pleroma_settings_store,
- :fields,
- :raw_fields,
- :discoverable,
- :invisible,
- :skip_thread_containment,
- :notification_settings
- ]
- @jsonb_fields [
- :banner,
- :background,
- :source_data,
- :settings,
- :email_notifications,
- :mascot,
- :pleroma_settings_store,
- :notification_settings
- ]
- @array_jsonb_fields [:emoji, :fields, :raw_fields]
- @int_fields [:note_count, :follower_count, :following_count, :unread_conversation_count]
- @boolean_fields [
- :locked,
- :confirmation_pending,
- :password_reset_pending,
- :deactivated,
- :no_rich_text,
- :ap_enabled,
- :is_moderator,
- :is_admin,
- :show_role,
- :hide_followers_count,
- :hide_follows_count,
- :hide_followers,
- :hide_follows,
- :hide_favorites,
- :discoverable,
- :invisible,
- :skip_thread_containment
- ]
- @array_text_fields [
- :blocks,
- :domain_blocks,
- :mutes,
- :muted_reblogs,
- :muted_notifications,
- :subscribers,
- :pinned_activities
- ]
- def change do
- if direction() == :up do
- sets =
- for f <- @info_fields do
- set_field = "#{f} ="
- # Coercion of null::jsonb to NULL
- jsonb = "case when info->>'#{f}' IS NULL then null else info->'#{f}' end"
- cond do
- f in @jsonb_fields ->
- "#{set_field} #{jsonb}"
- f in @array_jsonb_fields ->
- "#{set_field} coalesce(#{jsonb}, #{@jsonb_array_default})"
- f in @int_fields ->
- "#{set_field} (info->>'#{f}')::int"
- f in @boolean_fields ->
- "#{set_field} coalesce((info->>'#{f}')::boolean, false)"
- f in @array_text_fields ->
- "#{set_field} ARRAY(SELECT jsonb_array_elements_text(#{jsonb}))"
- true ->
- "#{set_field} info->>'#{f}'"
- end
- end
- |> Enum.join(", ")
- execute("update users set " <> sets)
- for index_name <- [
- :users_deactivated_index,
- :users_is_moderator_index,
- :users_is_admin_index,
- :users_subscribers_index
- ] do
- drop_if_exists(index(:users, [], name: index_name))
- end
- end
- create_if_not_exists(index(:users, [:deactivated]))
- create_if_not_exists(index(:users, [:is_moderator]))
- create_if_not_exists(index(:users, [:is_admin]))
- create_if_not_exists(index(:users, [:subscribers]))
- end
- end