diff options
Diffstat (limited to 'app/services/resource_access_tokens/create_service.rb')
-rw-r--r-- | app/services/resource_access_tokens/create_service.rb | 34 |
1 files changed, 13 insertions, 21 deletions
diff --git a/app/services/resource_access_tokens/create_service.rb b/app/services/resource_access_tokens/create_service.rb index f6fe23b4555..cfa43f5d9c8 100644 --- a/app/services/resource_access_tokens/create_service.rb +++ b/app/services/resource_access_tokens/create_service.rb @@ -2,6 +2,8 @@ module ResourceAccessTokens class CreateService < BaseService + include Gitlab::Utils::StrongMemoize + def initialize(current_user, resource, params = {}) @resource_type = resource.class.name.downcase @resource = resource @@ -25,7 +27,7 @@ module ResourceAccessTokens unless member.persisted? delete_failed_user(user) - return error("Could not provision #{Gitlab::Access.human_access(access_level).downcase} access to project access token") + return error("Could not provision #{Gitlab::Access.human_access(access_level.to_i).downcase} access to the access token. ERROR: #{member.errors.full_messages.to_sentence}") end token_response = create_personal_access_token(user) @@ -43,6 +45,14 @@ module ResourceAccessTokens attr_reader :resource_type, :resource + def username_and_email_generator + Gitlab::Utils::UsernameAndEmailGenerator.new( + username_prefix: "#{resource_type}_#{resource.id}_bot", + email_domain: "noreply.#{Gitlab.config.gitlab.host}" + ) + end + strong_memoize_attr :username_and_email_generator + def has_permission_to_create? %w(project group).include?(resource_type) && can?(current_user, :create_resource_access_tokens, resource) end @@ -63,31 +73,13 @@ module ResourceAccessTokens def default_user_params { name: params[:name] || "#{resource.name.to_s.humanize} bot", - email: generate_email, - username: generate_username, + email: username_and_email_generator.email, + username: username_and_email_generator.username, user_type: :project_bot, skip_confirmation: true # Bot users should always have their emails confirmed. } end - def generate_username - base_username = "#{resource_type}_#{resource.id}_bot" - - uniquify.string(base_username) { |s| User.find_by_username(s) } - end - - def generate_email - email_pattern = "#{resource_type}#{resource.id}_bot%s@noreply.#{Gitlab.config.gitlab.host}" - - uniquify.string(-> (n) { Kernel.sprintf(email_pattern, n) }) do |s| - User.find_by_email(s) - end - end - - def uniquify - Uniquify.new - end - def create_personal_access_token(user) PersonalAccessTokens::CreateService.new( current_user: user, target_user: user, params: personal_access_token_params |