Files
gitlab-foss/lib/gitlab/background_migration/populate_detumbled_email_in_emails.rb
2024-09-12 15:09:50 +00:00

42 lines
1.2 KiB
Ruby

# frozen_string_literal: true
module Gitlab
module BackgroundMigration
class PopulateDetumbledEmailInEmails < BatchedMigrationJob
scope_to ->(relation) { relation.where(detumbled_email: nil) }
operation_name :populate_detumbled_email
feature_category :user_management
EMAIL_REGEXP = /\A[^@\s]+@[^@\s]+\z/
def perform
each_sub_batch do |sub_batch|
sub_batch.each do |email|
email.update!(detumbled_email: normalize_email(email.email))
end
end
end
private
# Method copied from lib/gitlab/utils/email.rb
def normalize_email(email)
return email unless email.is_a?(String)
return email unless EMAIL_REGEXP.match?(email.strip)
portions = email.downcase.strip.split('@')
mailbox = portions.shift
domain = portions.join
mailbox_root = mailbox.split('+')[0]
# Gmail addresses strip the "." from their emails.
# For example, user.name@gmail.com is the same as username@gmail.com
mailbox_root = mailbox_root.tr('.', '') if domain == 'gmail.com'
[mailbox_root, domain].join('@')
end
end
end
end