diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-24 12:09:25 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-24 12:09:25 +0300 |
commit | 6f7881ee9dcec34141a8f34fc814b56b366d2b48 (patch) | |
tree | 25f72a06874b32b1049b79a9d7f4f1b7bca43b9b /app/services/users/update_canonical_email_service.rb | |
parent | 8c8bf44fa64f98114f7439f751c92d59a44b3218 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services/users/update_canonical_email_service.rb')
-rw-r--r-- | app/services/users/update_canonical_email_service.rb | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/app/services/users/update_canonical_email_service.rb b/app/services/users/update_canonical_email_service.rb new file mode 100644 index 00000000000..1400fd58eb4 --- /dev/null +++ b/app/services/users/update_canonical_email_service.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +module Users + class UpdateCanonicalEmailService + extend ActiveSupport::Concern + + INCLUDED_DOMAINS_PATTERN = [/gmail.com/].freeze + + def initialize(user:) + raise ArgumentError.new("Please provide a user") unless user&.is_a?(User) + + @user = user + end + + def execute + return unless user.email + return unless user.email.match? Devise.email_regexp + + canonical_email = canonicalize_email + + unless canonical_email + # the canonical email doesn't exist, probably because the domain doesn't match + # destroy any UserCanonicalEmail record associated with this user + user.user_canonical_email&.delete + # nothing else to do here + return + end + + if user.user_canonical_email + # update to the new value + user.user_canonical_email.canonical_email = canonical_email + else + user.build_user_canonical_email(canonical_email: canonical_email) + end + end + + private + + attr_reader :user + + def canonicalize_email + email = user.email + + portions = email.split('@') + username = portions.shift + rest = portions.join + + regex = Regexp.union(INCLUDED_DOMAINS_PATTERN) + return unless regex.match?(rest) + + no_dots = username.tr('.', '') + before_plus = no_dots.split('+')[0] + "#{before_plus}@#{rest}" + end + end +end |