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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
# frozen_string_literal: true
module Groups
module ImportExport
class ExportService
def initialize(group:, user:, params: {})
@group = group
@current_user = user
@params = params
@shared = @params[:shared] || Gitlab::ImportExport::Shared.new(@group)
@logger = Gitlab::Export::Logger.build
end
def async_execute
GroupExportWorker.perform_async(@current_user.id, @group.id, @params)
end
def execute
validate_user_permissions
remove_existing_export! if @group.export_file_exists?
save!
ensure
remove_base_tmp_dir
end
private
attr_accessor :shared
def validate_user_permissions
unless @current_user.can?(:admin_group, @group)
@shared.error(::Gitlab::ImportExport::Error.permission_error(@current_user, @group))
notify_error!
end
end
def remove_existing_export!
import_export_upload = @group.import_export_upload
import_export_upload.remove_export_file!
import_export_upload.save
end
def save!
if savers.all?(&:save)
notify_success
else
notify_error!
end
end
def savers
[version_saver, tree_exporter, file_saver]
end
def tree_exporter
tree_exporter_class.new(
group: @group,
current_user: @current_user,
shared: @shared,
params: @params
)
end
def tree_exporter_class
if ::Feature.enabled?(:group_export_ndjson, @group&.parent, default_enabled: true)
Gitlab::ImportExport::Group::TreeSaver
else
Gitlab::ImportExport::Group::LegacyTreeSaver
end
end
def version_saver
Gitlab::ImportExport::VersionSaver.new(shared: shared)
end
def file_saver
Gitlab::ImportExport::Saver.new(exportable: @group, shared: @shared)
end
def remove_base_tmp_dir
FileUtils.rm_rf(shared.base_path) if shared&.base_path
end
def notify_error!
notify_error
raise Gitlab::ImportExport::Error.new(shared.errors.to_sentence)
end
def notify_success
@logger.info(
message: 'Group Export succeeded',
group_id: @group.id,
group_name: @group.name
)
notification_service.group_was_exported(@group, @current_user)
end
def notify_error
@logger.error(
message: 'Group Export failed',
group_id: @group.id,
group_name: @group.name,
errors: @shared.errors.join(', ')
)
notification_service.group_was_not_exported(@group, @current_user, @shared.errors)
end
def notification_service
@notification_service ||= NotificationService.new
end
end
end
end
|