1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Repo.Migrations.CopyUsersInfoFieldsToUsers do
8 @jsonb_array_default "'[]'::jsonb"
18 :confirmation_pending,
19 :password_reset_pending,
37 :hide_followers_count,
42 :unread_conversation_count,
47 :pleroma_settings_store,
52 :skip_thread_containment,
53 :notification_settings
63 :pleroma_settings_store,
64 :notification_settings
67 @array_jsonb_fields [:emoji, :fields, :raw_fields]
69 @int_fields [:note_count, :follower_count, :following_count, :unread_conversation_count]
73 :confirmation_pending,
74 :password_reset_pending,
81 :hide_followers_count,
88 :skip_thread_containment
102 if direction() == :up do
104 for f <- @info_fields do
107 # Coercion of null::jsonb to NULL
108 jsonb = "case when info->>'#{f}' IS NULL then null else info->'#{f}' end"
111 f in @jsonb_fields ->
112 "#{set_field} #{jsonb}"
114 f in @array_jsonb_fields ->
115 "#{set_field} coalesce(#{jsonb}, #{@jsonb_array_default})"
118 "#{set_field} (info->>'#{f}')::int"
120 f in @boolean_fields ->
121 "#{set_field} coalesce((info->>'#{f}')::boolean, false)"
123 f in @array_text_fields ->
124 "#{set_field} ARRAY(SELECT jsonb_array_elements_text(#{jsonb}))"
127 "#{set_field} info->>'#{f}'"
132 execute("update users set " <> sets)
135 :users_deactivated_index,
136 :users_is_moderator_index,
137 :users_is_admin_index,
138 :users_subscribers_index
140 drop_if_exists(index(:users, [], name: index_name))
144 create_if_not_exists(index(:users, [:deactivated]))
145 create_if_not_exists(index(:users, [:is_moderator]))
146 create_if_not_exists(index(:users, [:is_admin]))
147 create_if_not_exists(index(:users, [:subscribers]))