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

import_project_team_service.rb « members « services « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: ef43d8206a97fafcc88207aa2ac0b630b3c728ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# frozen_string_literal: true

module Members
  class ImportProjectTeamService < BaseService
    ImportProjectTeamForbiddenError = Class.new(StandardError)

    def initialize(*args)
      super

      @errors = {}
    end

    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

    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 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 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

    def check_member_validity(member)
      return if member.valid?

      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

    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