mirror of
https://gitlab.com/gitlab-org/gitlab-foss.git
synced 2025-08-06 10:19:48 +00:00
97 lines
2.4 KiB
Ruby
97 lines
2.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Import
|
|
class ImportUserCreator
|
|
include Gitlab::Utils::StrongMemoize
|
|
|
|
NoRootGroupError = Class.new(StandardError)
|
|
|
|
attr_reader :portable
|
|
|
|
def initialize(portable:)
|
|
@portable = portable
|
|
end
|
|
|
|
def execute
|
|
raise NoRootGroupError, 'Portable has no root group' unless root_ancestor
|
|
|
|
return import_user if import_user
|
|
|
|
User.transaction do
|
|
user = create_user
|
|
create_namespace_import_user(user)
|
|
user
|
|
end
|
|
rescue ActiveRecord::RecordNotUnique => e
|
|
::Import::Framework::Logger.warn(
|
|
message: 'Failed to create namespace_import_user',
|
|
error: e.message
|
|
)
|
|
|
|
# Import user already exists, try finding it again
|
|
import_user
|
|
end
|
|
|
|
private
|
|
|
|
def create_user
|
|
User.create!(
|
|
user_type: :import_user,
|
|
name: 'Import User',
|
|
username: username_and_email_generator.username,
|
|
email: username_and_email_generator.email,
|
|
organizations: [root_ancestor.organization],
|
|
organization: root_ancestor.organization
|
|
) do |u|
|
|
u.assign_personal_namespace(root_ancestor.organization)
|
|
end
|
|
end
|
|
|
|
def create_namespace_import_user(user)
|
|
::Import::NamespaceImportUser.create!(
|
|
user_id: user.id,
|
|
namespace_id: root_ancestor.id
|
|
)
|
|
end
|
|
|
|
def username_and_email_generator
|
|
Gitlab::Utils::UsernameAndEmailGenerator.new(
|
|
username_prefix: username_prefix,
|
|
email_domain: "noreply.#{Gitlab.config.gitlab.host}",
|
|
random_segment: random_segment
|
|
)
|
|
end
|
|
strong_memoize_attr :username_and_email_generator
|
|
|
|
def import_user
|
|
return import_user_in_cache if import_user_in_cache
|
|
|
|
root_ancestor.reset.import_user.tap do |import_user|
|
|
Gitlab::SafeRequestStore.write(request_store_cache_key, import_user) if import_user
|
|
end
|
|
end
|
|
|
|
def root_ancestor
|
|
portable.root_ancestor
|
|
end
|
|
|
|
def username_prefix
|
|
"import_user_#{root_ancestor.path}"
|
|
end
|
|
|
|
def random_segment
|
|
SecureRandom.alphanumeric(4)
|
|
end
|
|
|
|
def import_user_in_cache
|
|
Gitlab::SafeRequestStore.read(request_store_cache_key)
|
|
end
|
|
|
|
def request_store_cache_key
|
|
"import_user_creator_#{root_ancestor.id}"
|
|
end
|
|
end
|
|
end
|
|
end
|