40 lines
1.1 KiB
Ruby
40 lines
1.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module BulkImports
|
|
class ExportService
|
|
# @param portable [Project|Group] A project or a group to export.
|
|
# @param user [User] A user performing the export.
|
|
# @param batched [Boolean] Whether to export the data in batches.
|
|
def initialize(portable:, user:, batched: false)
|
|
@portable = portable
|
|
@current_user = user
|
|
@batched = batched
|
|
end
|
|
|
|
def execute
|
|
validate_user_permissions!
|
|
|
|
FileTransfer.config_for(portable).portable_relations.each do |relation|
|
|
RelationExportWorker.perform_async(current_user.id, portable.id, portable.class.name, relation, batched)
|
|
end
|
|
|
|
ServiceResponse.success
|
|
rescue StandardError => e
|
|
ServiceResponse.error(
|
|
message: e.class,
|
|
http_status: :unprocessable_entity
|
|
)
|
|
end
|
|
|
|
private
|
|
|
|
attr_reader :portable, :current_user, :batched
|
|
|
|
def validate_user_permissions!
|
|
ability = "admin_#{portable.to_ability_name}"
|
|
|
|
current_user.can?(ability, portable) ||
|
|
raise(::Gitlab::ImportExport::Error.permission_error(current_user, portable))
|
|
end
|
|
end
|
|
end
|