- alter table(:users) do
- add(:banner, :map, default: %{})
- add(:background, :map, default: %{})
- add(:source_data, :map, default: %{})
- add(:note_count, :integer, default: 0)
- add(:follower_count, :integer, default: 0)
- # Should be filled in only for remote users
- add(:following_count, :integer, default: nil)
- add(:locked, :boolean, default: false)
- add(:confirmation_pending, :boolean, default: false)
- add(:password_reset_pending, :boolean, default: false)
- add(:confirmation_token, :text, default: nil)
- add(:default_scope, :string, default: "public")
- add(:blocks, {:array, :text}, default: [])
- add(:domain_blocks, {:array, :text}, default: [])
- add(:mutes, {:array, :text}, default: [])
- add(:muted_reblogs, {:array, :text}, default: [])
- add(:muted_notifications, {:array, :text}, default: [])
- add(:subscribers, {:array, :text}, default: [])
- add(:deactivated, :boolean, default: false, null: false)
- add(:no_rich_text, :boolean, default: false, null: false)
- add(:ap_enabled, :boolean, default: false, null: false)
- add(:is_moderator, :boolean, default: false, null: false)
- add(:is_admin, :boolean, default: false, null: false)
- add(:show_role, :boolean, default: true, null: false)
- add(:settings, :map, default: nil)
- add(:magic_key, :text, default: nil)
- add(:uri, :text, default: nil)
- add(:topic, :text, default: nil)
- add(:hub, :text, default: nil)
- add(:salmon, :text, default: nil)
- add(:hide_followers_count, :boolean, default: false, null: false)
- add(:hide_follows_count, :boolean, default: false, null: false)
- add(:hide_followers, :boolean, default: false, null: false)
- add(:hide_follows, :boolean, default: false, null: false)
- add(:hide_favorites, :boolean, default: true, null: false)
- add(:unread_conversation_count, :integer, default: 0)
- add(:pinned_activities, {:array, :text}, default: [])
- add(:email_notifications, :map, default: %{"digest" => false})
- add(:mascot, :map, default: nil)
- add(:emoji, {:array, :map}, default: [])
- add(:pleroma_settings_store, :map, default: %{})
- add(:fields, {:array, :map}, default: nil)
- add(:raw_fields, {:array, :map}, default: [])
- add(:discoverable, :boolean, default: false, null: false)
- add(:notification_settings, :map, default: %{})
- add(:skip_thread_containment, :boolean, default: false, null: false)
+ 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