summaryrefslogtreecommitdiff
path: root/lib/gitlab/utils/username_and_email_generator.rb
blob: 38c9bb7050da65d8ba8ee743ae9e53a64743566d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# frozen_string_literal: true

require 'securerandom'

module Gitlab
  module Utils
    class UsernameAndEmailGenerator
      include Gitlab::Utils::StrongMemoize

      def initialize(username_prefix:, email_domain: Gitlab.config.gitlab.host)
        @username_prefix = username_prefix
        @email_domain = email_domain
      end

      def username
        uniquify.string(->(counter) { Kernel.sprintf(username_pattern, counter) }) do |suggested_username|
          ::Namespace.by_path(suggested_username) || ::User.find_by_any_email(email_for(suggested_username))
        end
      end
      strong_memoize_attr :username

      def email
        email_for(username)
      end
      strong_memoize_attr :email

      private

      def username_pattern
        "#{@username_prefix}_#{SecureRandom.hex(16)}%s"
      end

      def email_for(name)
        "#{name}@#{@email_domain}"
      end

      def uniquify
        Gitlab::Utils::Uniquify.new
      end
    end
  end
end