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
|