mirror of
https://gitlab.com/gitlab-org/gitlab-foss.git
synced 2025-07-25 16:03:48 +00:00
51 lines
1.2 KiB
Ruby
51 lines
1.2 KiB
Ruby
# 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, random_segment: SecureRandom.hex(16))
|
|
@username_prefix = username_prefix
|
|
@email_domain = email_domain
|
|
@random_segment = random_segment
|
|
end
|
|
|
|
def username
|
|
uniquify.string(->(counter) { Kernel.sprintf(username_pattern, counter) }) do |suggested_username|
|
|
suggested_email = email_for(suggested_username)
|
|
|
|
::Namespace.by_path(suggested_username) ||
|
|
::User.username_exists?(suggested_username) ||
|
|
::User.find_by_any_email(suggested_email) ||
|
|
::Email.find_by_email(suggested_email)
|
|
end
|
|
end
|
|
strong_memoize_attr :username
|
|
|
|
def email
|
|
email_for(username)
|
|
end
|
|
strong_memoize_attr :email
|
|
|
|
private
|
|
|
|
attr_reader :random_segment, :username_prefix
|
|
|
|
def username_pattern
|
|
"#{username_prefix}_#{random_segment}%s"
|
|
end
|
|
|
|
def email_for(name)
|
|
"#{name}@#{@email_domain}"
|
|
end
|
|
|
|
def uniquify
|
|
Gitlab::Utils::Uniquify.new
|
|
end
|
|
end
|
|
end
|
|
end
|