1 defmodule Pleroma.Repo.Migrations.CopyUsersInfoFieldsToUsers do
4 @jsonb_array_default "'[]'::jsonb"
14 :confirmation_pending,
15 :password_reset_pending,
33 :hide_followers_count,
38 :unread_conversation_count,
43 :pleroma_settings_store,
48 :skip_thread_containment,
49 :notification_settings
59 :pleroma_settings_store,
60 :notification_settings
63 @array_jsonb_fields [:emoji, :fields, :raw_fields]
65 @int_fields [:note_count, :follower_count, :following_count, :unread_conversation_count]
69 :confirmation_pending,
70 :password_reset_pending,
77 :hide_followers_count,
84 :skip_thread_containment
98 alter table(:users) do
99 add(:banner, :map, default: %{})
100 add(:background, :map, default: %{})
101 add(:source_data, :map, default: %{})
102 add(:note_count, :integer, default: 0)
103 add(:follower_count, :integer, default: 0)
104 add(:following_count, :integer, default: nil)
105 add(:locked, :boolean, default: false, null: false)
106 add(:confirmation_pending, :boolean, default: false, null: false)
107 add(:password_reset_pending, :boolean, default: false, null: false)
108 add(:confirmation_token, :text, default: nil)
109 add(:default_scope, :string, default: "public")
110 add(:blocks, {:array, :text}, default: [])
111 add(:domain_blocks, {:array, :text}, default: [])
112 add(:mutes, {:array, :text}, default: [])
113 add(:muted_reblogs, {:array, :text}, default: [])
114 add(:muted_notifications, {:array, :text}, default: [])
115 add(:subscribers, {:array, :text}, default: [])
116 add(:deactivated, :boolean, default: false, null: false)
117 add(:no_rich_text, :boolean, default: false, null: false)
118 add(:ap_enabled, :boolean, default: false, null: false)
119 add(:is_moderator, :boolean, default: false, null: false)
120 add(:is_admin, :boolean, default: false, null: false)
121 add(:show_role, :boolean, default: true, null: false)
122 add(:settings, :map, default: nil)
123 add(:magic_key, :text, default: nil)
124 add(:uri, :text, default: nil)
125 add(:hide_followers_count, :boolean, default: false, null: false)
126 add(:hide_follows_count, :boolean, default: false, null: false)
127 add(:hide_followers, :boolean, default: false, null: false)
128 add(:hide_follows, :boolean, default: false, null: false)
129 add(:hide_favorites, :boolean, default: true, null: false)
130 add(:unread_conversation_count, :integer, default: 0)
131 add(:pinned_activities, {:array, :text}, default: [])
132 add(:email_notifications, :map, default: %{"digest" => false})
133 add(:mascot, :map, default: nil)
134 add(:emoji, :map, default: fragment(@jsonb_array_default))
135 add(:pleroma_settings_store, :map, default: %{})
136 add(:fields, :map, default: fragment(@jsonb_array_default))
137 add(:raw_fields, :map, default: fragment(@jsonb_array_default))
138 add(:discoverable, :boolean, default: false, null: false)
139 add(:invisible, :boolean, default: false, null: false)
140 add(:notification_settings, :map, default: %{})
141 add(:skip_thread_containment, :boolean, default: false, null: false)
144 if direction() == :up do
145 for f <- @info_fields do
146 set_field = "update users set #{f} ="
148 # Coercion of null::jsonb to NULL
149 jsonb = "case when info->>'#{f}' IS NULL then null else info->'#{f}' end"
152 f in @jsonb_fields ->
153 execute("#{set_field} #{jsonb}")
155 f in @array_jsonb_fields ->
156 execute("#{set_field} coalesce(#{jsonb}, #{@jsonb_array_default})")
159 execute("#{set_field} (info->>'#{f}')::int")
161 f in @boolean_fields ->
162 execute("#{set_field} coalesce((info->>'#{f}')::boolean, false)")
164 f in @array_text_fields ->
165 execute("#{set_field} ARRAY(SELECT jsonb_array_elements_text(#{jsonb}))")
168 execute("#{set_field} info->>'#{f}'")
173 :users_deactivated_index,
174 :users_is_moderator_index,
175 :users_is_admin_index,
176 :users_subscribers_index
178 drop_if_exists(index(:users, [], name: index_name))
182 create_if_not_exists(index(:users, [:deactivated]))
183 create_if_not_exists(index(:users, [:is_moderator]))
184 create_if_not_exists(index(:users, [:is_admin]))
185 create_if_not_exists(index(:users, [:subscribers]))