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 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
# frozen_string_literal: true
module API
class GroupExport < ::API::Base
before do
authorize! :admin_group, user_group
end
feature_category :importers
urgency :low
params do
requires :id, type: String, desc: 'The ID of a group'
end
resource :groups, requirements: { id: %r{[^/]+} } do
desc 'Download export' do
detail 'This feature was introduced in GitLab 12.5.'
tags %w[group_export]
produces %w[application/octet-stream application/json]
success code: 200
failure [
{ code: 400, message: 'Bad request' },
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' },
{ code: 503, message: 'Service unavailable' }
]
end
get ':id/export/download' do
check_rate_limit! :group_download_export, scope: [current_user, user_group]
if user_group.export_file_exists?(current_user)
if user_group.export_archive_exists?(current_user)
present_carrierwave_file!(user_group.export_file(current_user))
else
render_api_error!('The group export file is not available yet', 404)
end
else
render_api_error!('404 Not found or has expired', 404)
end
end
desc 'Start export' do
detail 'This feature was introduced in GitLab 12.5.'
tags %w[group_export]
success code: 202
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' },
{ code: 429, message: 'Too many requests' },
{ code: 503, message: 'Service unavailable' }
]
end
post ':id/export' do
check_rate_limit! :group_export, scope: current_user
export_service = ::Groups::ImportExport::ExportService.new(
group: user_group,
user: current_user,
exported_by_admin: current_user.can_admin_all_resources?
)
if export_service.async_execute
accepted!
else
render_api_error!(message: 'Group export could not be started.')
end
end
resource do
before do
not_found! unless Gitlab::CurrentSettings.bulk_import_enabled? ||
Feature.enabled?(:override_bulk_import_disabled, current_user, type: :ops)
end
desc 'Start relations export' do
detail 'This feature was introduced in GitLab 13.12'
tags %w[group_export]
success code: 202
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' },
{ code: 503, message: 'Service unavailable' }
]
end
params do
optional :batched, type: Boolean, desc: 'Whether to export in batches'
end
post ':id/export_relations' do
response = ::BulkImports::ExportService
.new(portable: user_group, user: current_user, batched: params[:batched])
.execute
if response.success?
accepted!
else
render_api_error!(message: 'Group relations export could not be started.')
end
end
desc 'Download relations export' do
detail 'This feature was introduced in GitLab 13.12'
produces %w[application/octet-stream application/json]
tags %w[group_export]
success code: 200
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' },
{ code: 503, message: 'Service unavailable' }
]
end
params do
requires :relation, type: String, desc: 'Group relation name'
optional :batched, type: Boolean, desc: 'Whether to download in batches'
optional :batch_number, type: Integer, desc: 'Batch number to download'
all_or_none_of :batched, :batch_number
end
get ':id/export_relations/download' do
export = user_group.bulk_import_exports.for_user_and_relation(current_user, params[:relation]).first
break render_api_error!('Export not found', 404) unless export
if params[:batched]
batch = export.batches.find_by_batch_number(params[:batch_number])
batch_file = batch&.upload&.export_file
break render_api_error!('Export is not batched', 400) unless export.batched?
break render_api_error!('Batch not found', 404) unless batch
break render_api_error!('Batch file not found', 404) unless batch_file
present_carrierwave_file!(batch_file)
else
file = export&.upload&.export_file
break render_api_error!('Export is batched', 400) if export.batched?
break render_api_error!('Export file not found', 404) unless file
present_carrierwave_file!(file)
end
end
desc 'Relations export status' do
detail 'This feature was introduced in GitLab 13.12'
is_array true
tags %w[group_export]
success code: 200, model: Entities::BulkImports::ExportStatus
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' },
{ code: 503, message: 'Service unavailable' }
]
end
params do
optional :relation, type: String, desc: 'Group relation name'
end
get ':id/export_relations/status' do
if params[:relation]
export = user_group.bulk_import_exports.for_user_and_relation(current_user, params[:relation]).first
break render_api_error!('Export not found', 404) unless export
present export, with: Entities::BulkImports::ExportStatus
else
present user_group.bulk_import_exports.for_user(current_user), with: Entities::BulkImports::ExportStatus
end
end
end
end
end
end
|