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
121
122
123
124
125
126
127
128
129
130
|
# 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_archive_tmp_dir
end
private
attr_reader :group, :current_user, :params
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!
# We cannot include the file_saver with the other savers because
# it removes the tmp dir. This means that if we want to add new savers
# in EE the data won't be available.
if savers.all?(&:save) && file_saver.save
notify_success
else
notify_error!
end
end
def savers
[version_saver, tree_exporter]
end
def tree_exporter
tree_exporter_class.new(
group: group,
current_user: current_user,
shared: shared,
params: params
)
end
def tree_exporter_class
if ndjson?
Gitlab::ImportExport::Group::TreeSaver
else
Gitlab::ImportExport::Group::LegacyTreeSaver
end
end
def ndjson?
::Feature.enabled?(:group_export_ndjson, group&.parent)
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_archive_tmp_dir
FileUtils.rm_rf(shared.archive_path) if shared&.archive_path
end
def notify_error!
notify_error
raise Gitlab::ImportExport::Error, 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
Groups::ImportExport::ExportService.prepend_mod_with('Groups::ImportExport::ExportService')
|