diff options
Diffstat (limited to 'app/services/members/import_project_team_service.rb')
-rw-r--r-- | app/services/members/import_project_team_service.rb | 81 |
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 |