debian-mirror-gitlab/db/post_migrate/20220504083836_cleanup_after_fixing_regression_with_new_users_emails.rb
2022-07-16 19:58:13 +02:00

60 lines
1.7 KiB
Ruby

# frozen_string_literal: true
class CleanupAfterFixingRegressionWithNewUsersEmails < Gitlab::Database::Migration[2.0]
disable_ddl_transaction!
restrict_gitlab_migration gitlab_schema: :gitlab_main
BATCH_SIZE = 10_000
# Stubbed class to access the User table
class User < MigrationRecord
include ::EachBatch
self.table_name = 'users'
self.inheritance_column = :_type_disabled
scope :confirmed, -> { where.not(confirmed_at: nil) }
has_many :emails
end
# Stubbed class to access the Emails table
class Email < MigrationRecord
self.table_name = 'emails'
self.inheritance_column = :_type_disabled
belongs_to :user
end
# rubocop: disable Layout/LineLength
def up
# Select confirmed users that do not have their primary email in the emails table,
# and create the email record.
not_exists_condition = 'NOT EXISTS (SELECT 1 FROM emails WHERE emails.email = users.email AND emails.user_id = users.id)'
User.confirmed.each_batch(of: BATCH_SIZE) do |user_batch|
user_batch.select(:id, :email, :confirmed_at).where(not_exists_condition).each do |user|
current_time = Time.now.utc
begin
Email.create(
user_id: user.id,
email: user.email,
confirmed_at: user.confirmed_at,
created_at: current_time,
updated_at: current_time
)
rescue StandardError => error
Gitlab::AppLogger.error("Could not add primary email #{user.email} to emails for user with ID #{user.id} due to #{error}")
end
end
end
end
# rubocop: enable Layout/LineLength
def down
# Intentionally left blank
end
end