Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/members/import_project_team_service.rb')
-rw-r--r--app/services/members/import_project_team_service.rb81
1 files changed, 64 insertions, 17 deletions
diff --git a/app/services/members/import_project_team_service.rb b/app/services/members/import_project_team_service.rb
index 6efd65e2575..ef43d8206a9 100644
--- a/app/services/members/import_project_team_service.rb
+++ b/app/services/members/import_project_team_service.rb
@@ -2,36 +2,83 @@
module Members
class ImportProjectTeamService < BaseService
- attr_reader :params, :current_user
+ ImportProjectTeamForbiddenError = Class.new(StandardError)
- def target_project_id
- @target_project_id ||= params[:id].presence
+ def initialize(*args)
+ super
+
+ @errors = {}
end
- def source_project_id
- @source_project_id ||= params[:project_id].presence
+ def execute
+ check_target_and_source_projects_exist!
+ check_user_permissions!
+
+ import_project_team
+ process_import_result
+
+ result
+ rescue ArgumentError, ImportProjectTeamForbiddenError => e
+ ServiceResponse.error(message: e.message, reason: :unprocessable_entity)
end
- def target_project
- @target_project ||= Project.find_by_id(target_project_id)
+ private
+
+ attr_reader :members, :params, :current_user, :errors, :result
+
+ def import_project_team
+ @members = target_project.team.import(source_project, current_user)
+
+ if members.is_a?(Array)
+ members.each { |member| check_member_validity(member) }
+ else
+ @result = ServiceResponse.error(message: 'Import failed', reason: :unprocessable_entity)
+ end
end
- def source_project
- @source_project ||= Project.find_by_id(source_project_id)
+ def check_target_and_source_projects_exist!
+ if target_project.blank?
+ raise ArgumentError, 'Target project does not exist'
+ elsif source_project.blank?
+ raise ArgumentError, 'Source project does not exist'
+ end
end
- def execute
- import_project_team
+ def check_user_permissions!
+ return if can?(current_user, :read_project_member, source_project) &&
+ can?(current_user, :import_project_members_from_another_project, target_project)
+
+ raise ImportProjectTeamForbiddenError, 'Forbidden'
end
- private
+ def check_member_validity(member)
+ return if member.valid?
- def import_project_team
- return false unless target_project.present? && source_project.present? && current_user.present?
- return false unless can?(current_user, :read_project_member, source_project)
- return false unless can?(current_user, :import_project_members_from_another_project, target_project)
+ errors[member.user.username] = member.errors.full_messages.to_sentence
+ end
+
+ def process_import_result
+ @result ||= if errors.any?
+ ServiceResponse.error(message: errors, payload: { total_members_count: members.size })
+ else
+ ServiceResponse.success(message: 'Successfully imported')
+ end
+ end
+
+ def target_project_id
+ params[:id]
+ end
- target_project.team.import(source_project, current_user)
+ def source_project_id
+ params[:project_id]
+ end
+
+ def target_project
+ @target_project ||= Project.find_by_id(target_project_id)
+ end
+
+ def source_project
+ @source_project ||= Project.find_by_id(source_project_id)
end
end
end