2021-09-30 23:02:18 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module API
|
|
|
|
class BulkImports < ::API::Base
|
|
|
|
include PaginationParams
|
|
|
|
|
|
|
|
feature_category :importers
|
2022-07-16 23:28:13 +05:30
|
|
|
urgency :low
|
2021-09-30 23:02:18 +05:30
|
|
|
|
|
|
|
helpers do
|
|
|
|
def bulk_imports
|
2021-10-27 15:23:28 +05:30
|
|
|
@bulk_imports ||= ::BulkImports::ImportsFinder.new(
|
|
|
|
user: current_user,
|
2022-06-21 17:19:12 +05:30
|
|
|
params: params
|
2021-10-27 15:23:28 +05:30
|
|
|
).execute
|
2021-09-30 23:02:18 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
def bulk_import
|
|
|
|
@bulk_import ||= bulk_imports.find(params[:import_id])
|
|
|
|
end
|
|
|
|
|
|
|
|
def bulk_import_entities
|
2021-10-27 15:23:28 +05:30
|
|
|
@bulk_import_entities ||= ::BulkImports::EntitiesFinder.new(
|
|
|
|
user: current_user,
|
|
|
|
bulk_import: bulk_import,
|
2022-06-21 17:19:12 +05:30
|
|
|
params: params
|
2021-10-27 15:23:28 +05:30
|
|
|
).execute
|
2021-09-30 23:02:18 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
def bulk_import_entity
|
|
|
|
@bulk_import_entity ||= bulk_import_entities.find(params[:entity_id])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-11-25 23:54:43 +05:30
|
|
|
before do
|
2023-06-09 08:11:10 +05:30
|
|
|
not_found! unless Gitlab::CurrentSettings.bulk_import_enabled?
|
2022-11-25 23:54:43 +05:30
|
|
|
|
|
|
|
authenticate!
|
|
|
|
end
|
2021-09-30 23:02:18 +05:30
|
|
|
|
|
|
|
resource :bulk_imports do
|
2021-10-27 15:23:28 +05:30
|
|
|
desc 'Start a new GitLab Migration' do
|
|
|
|
detail 'This feature was introduced in GitLab 14.2.'
|
2023-01-13 00:05:48 +05:30
|
|
|
success code: 200, model: Entities::BulkImport
|
|
|
|
consumes ['application/x-www-form-urlencoded']
|
|
|
|
failure [
|
|
|
|
{ code: 401, message: 'Unauthorized' },
|
|
|
|
{ code: 400, message: 'Bad request' },
|
|
|
|
{ code: 404, message: 'Not found' },
|
|
|
|
{ code: 422, message: 'Unprocessable entity' },
|
|
|
|
{ code: 503, message: 'Service unavailable' }
|
|
|
|
]
|
2021-10-27 15:23:28 +05:30
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :configuration, type: Hash, desc: 'The source GitLab instance configuration' do
|
|
|
|
requires :url, type: String, desc: 'Source GitLab instance URL'
|
|
|
|
requires :access_token, type: String, desc: 'Access token to the source GitLab instance'
|
|
|
|
end
|
|
|
|
requires :entities, type: Array, desc: 'List of entities to import' do
|
2022-08-27 11:52:29 +05:30
|
|
|
requires :source_type,
|
|
|
|
type: String,
|
|
|
|
desc: 'Source entity type (only `group_entity` is supported)',
|
2021-10-27 15:23:28 +05:30
|
|
|
values: %w[group_entity]
|
2023-06-09 08:11:10 +05:30
|
|
|
requires :source_full_path,
|
|
|
|
type: String,
|
|
|
|
desc: 'Relative path of the source entity to import',
|
|
|
|
source_full_path: true,
|
|
|
|
documentation: { example: "'source/full/path' not 'https://example.com/source/full/path'" }
|
|
|
|
requires :destination_namespace,
|
|
|
|
type: String,
|
|
|
|
desc: 'Destination namespace for the entity',
|
|
|
|
destination_namespace_path: true,
|
|
|
|
documentation: { example: "'destination_namespace' or 'destination/namespace'" }
|
|
|
|
optional :destination_slug,
|
|
|
|
type: String,
|
|
|
|
desc: 'Destination slug for the entity',
|
|
|
|
destination_slug_path: true,
|
|
|
|
documentation: { example: "'destination_slug' not 'destination/slug'" }
|
2022-08-27 11:52:29 +05:30
|
|
|
optional :destination_name,
|
|
|
|
type: String,
|
2023-06-09 08:11:10 +05:30
|
|
|
desc: 'Deprecated: Use :destination_slug instead. Destination slug for the entity',
|
|
|
|
destination_slug_path: true,
|
|
|
|
documentation: { example: "'destination_slug' not 'destination/slug'" }
|
|
|
|
optional :migrate_projects,
|
|
|
|
type: Boolean,
|
|
|
|
default: true,
|
|
|
|
desc: 'Indicates group migration should include nested projects'
|
2022-08-27 11:52:29 +05:30
|
|
|
|
|
|
|
mutually_exclusive :destination_slug, :destination_name
|
|
|
|
at_least_one_of :destination_slug, :destination_name
|
2021-10-27 15:23:28 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
post do
|
2023-06-09 08:11:10 +05:30
|
|
|
check_rate_limit!(:bulk_import, scope: current_user)
|
|
|
|
|
2022-08-27 11:52:29 +05:30
|
|
|
params[:entities].each do |entity|
|
|
|
|
if entity[:destination_name]
|
|
|
|
entity[:destination_slug] ||= entity[:destination_name]
|
|
|
|
entity.delete(:destination_name)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-11-18 22:05:49 +05:30
|
|
|
response = ::BulkImports::CreateService.new(
|
2021-10-27 15:23:28 +05:30
|
|
|
current_user,
|
|
|
|
params[:entities],
|
|
|
|
url: params[:configuration][:url],
|
|
|
|
access_token: params[:configuration][:access_token]
|
|
|
|
).execute
|
|
|
|
|
|
|
|
if response.success?
|
|
|
|
present response.payload, with: Entities::BulkImport
|
|
|
|
else
|
|
|
|
render_api_error!(response.message, response.http_status)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-09-30 23:02:18 +05:30
|
|
|
desc 'List all GitLab Migrations' do
|
|
|
|
detail 'This feature was introduced in GitLab 14.1.'
|
2023-01-13 00:05:48 +05:30
|
|
|
is_array true
|
|
|
|
success code: 200, model: Entities::BulkImport
|
|
|
|
failure [
|
|
|
|
{ code: 401, message: 'Unauthorized' },
|
|
|
|
{ code: 404, message: 'Not found' },
|
|
|
|
{ code: 503, message: 'Service unavailable' }
|
|
|
|
]
|
2021-09-30 23:02:18 +05:30
|
|
|
end
|
|
|
|
params do
|
|
|
|
use :pagination
|
2022-06-21 17:19:12 +05:30
|
|
|
optional :sort, type: String, values: %w[asc desc], default: 'desc',
|
2022-08-27 11:52:29 +05:30
|
|
|
desc: 'Return GitLab Migrations sorted in created by `asc` or `desc` order.'
|
2021-09-30 23:02:18 +05:30
|
|
|
optional :status, type: String, values: BulkImport.all_human_statuses,
|
2022-08-27 11:52:29 +05:30
|
|
|
desc: 'Return GitLab Migrations with specified status'
|
2021-09-30 23:02:18 +05:30
|
|
|
end
|
|
|
|
get do
|
|
|
|
present paginate(bulk_imports), with: Entities::BulkImport
|
|
|
|
end
|
|
|
|
|
|
|
|
desc "List all GitLab Migrations' entities" do
|
|
|
|
detail 'This feature was introduced in GitLab 14.1.'
|
2023-01-13 00:05:48 +05:30
|
|
|
is_array true
|
|
|
|
success code: 200, model: Entities::BulkImports::Entity
|
|
|
|
failure [
|
|
|
|
{ code: 401, message: 'Unauthorized' },
|
|
|
|
{ code: 404, message: 'Not found' },
|
|
|
|
{ code: 503, message: 'Service unavailable' }
|
|
|
|
]
|
2021-09-30 23:02:18 +05:30
|
|
|
end
|
|
|
|
params do
|
|
|
|
use :pagination
|
2022-06-21 17:19:12 +05:30
|
|
|
optional :sort, type: String, values: %w[asc desc], default: 'desc',
|
2022-08-27 11:52:29 +05:30
|
|
|
desc: 'Return GitLab Migrations sorted in created by `asc` or `desc` order.'
|
2021-09-30 23:02:18 +05:30
|
|
|
optional :status, type: String, values: ::BulkImports::Entity.all_human_statuses,
|
2022-08-27 11:52:29 +05:30
|
|
|
desc: "Return all GitLab Migrations' entities with specified status"
|
2021-09-30 23:02:18 +05:30
|
|
|
end
|
|
|
|
get :entities do
|
2021-10-27 15:23:28 +05:30
|
|
|
entities = ::BulkImports::EntitiesFinder.new(
|
|
|
|
user: current_user,
|
2022-06-21 17:19:12 +05:30
|
|
|
params: params
|
2021-10-27 15:23:28 +05:30
|
|
|
).execute
|
2021-09-30 23:02:18 +05:30
|
|
|
|
|
|
|
present paginate(entities), with: Entities::BulkImports::Entity
|
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Get GitLab Migration details' do
|
|
|
|
detail 'This feature was introduced in GitLab 14.1.'
|
2023-01-13 00:05:48 +05:30
|
|
|
success code: 200, model: Entities::BulkImport
|
|
|
|
failure [
|
|
|
|
{ code: 401, message: 'Unauthorized' },
|
|
|
|
{ code: 404, message: 'Not found' },
|
|
|
|
{ code: 503, message: 'Service unavailable' }
|
|
|
|
]
|
2021-09-30 23:02:18 +05:30
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :import_id, type: Integer, desc: "The ID of user's GitLab Migration"
|
|
|
|
end
|
|
|
|
get ':import_id' do
|
|
|
|
present bulk_import, with: Entities::BulkImport
|
|
|
|
end
|
|
|
|
|
|
|
|
desc "List GitLab Migration entities" do
|
|
|
|
detail 'This feature was introduced in GitLab 14.1.'
|
2023-01-13 00:05:48 +05:30
|
|
|
is_array true
|
|
|
|
success code: 200, model: Entities::BulkImports::Entity
|
|
|
|
failure [
|
|
|
|
{ code: 401, message: 'Unauthorized' },
|
|
|
|
{ code: 404, message: 'Not found' },
|
|
|
|
{ code: 503, message: 'Service unavailable' }
|
|
|
|
]
|
2021-09-30 23:02:18 +05:30
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :import_id, type: Integer, desc: "The ID of user's GitLab Migration"
|
|
|
|
optional :status, type: String, values: ::BulkImports::Entity.all_human_statuses,
|
2022-08-27 11:52:29 +05:30
|
|
|
desc: 'Return import entities with specified status'
|
2021-09-30 23:02:18 +05:30
|
|
|
use :pagination
|
|
|
|
end
|
|
|
|
get ':import_id/entities' do
|
|
|
|
present paginate(bulk_import_entities), with: Entities::BulkImports::Entity
|
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Get GitLab Migration entity details' do
|
|
|
|
detail 'This feature was introduced in GitLab 14.1.'
|
2023-01-13 00:05:48 +05:30
|
|
|
success code: 200, model: Entities::BulkImports::Entity
|
|
|
|
failure [
|
|
|
|
{ code: 401, message: 'Unauthorized' },
|
|
|
|
{ code: 404, message: 'Not found' },
|
|
|
|
{ code: 503, message: 'Service unavailable' }
|
|
|
|
]
|
2021-09-30 23:02:18 +05:30
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :import_id, type: Integer, desc: "The ID of user's GitLab Migration"
|
|
|
|
requires :entity_id, type: Integer, desc: "The ID of GitLab Migration entity"
|
|
|
|
end
|
|
|
|
get ':import_id/entities/:entity_id' do
|
|
|
|
present bulk_import_entity, with: Entities::BulkImports::Entity
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|