2020-05-21 05:08:04 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
class Import::GitlabGroupsController < ApplicationController
|
2020-11-30 22:09:24 -05:00
|
|
|
include WorkhorseAuthorization
|
2020-05-21 05:08:04 -04:00
|
|
|
|
|
|
|
before_action :ensure_group_import_enabled
|
2021-12-10 10:10:24 -05:00
|
|
|
before_action :check_import_rate_limit!, only: %i[create]
|
2020-05-21 05:08:04 -04:00
|
|
|
|
2020-10-05 08:08:47 -04:00
|
|
|
feature_category :importers
|
|
|
|
|
2020-05-21 05:08:04 -04:00
|
|
|
def create
|
|
|
|
unless file_is_valid?(group_params[:file])
|
2021-03-02 16:11:07 -05:00
|
|
|
return redirect_to new_group_path(anchor: 'import-group-pane'), alert: s_('GroupImport|Unable to process group import file')
|
2020-05-21 05:08:04 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
group_data = group_params.except(:file).merge(
|
|
|
|
visibility_level: closest_allowed_visibility_level,
|
|
|
|
import_export_upload: ImportExportUpload.new(import_file: group_params[:file])
|
|
|
|
)
|
|
|
|
|
|
|
|
group = ::Groups::CreateService.new(current_user, group_data).execute
|
|
|
|
|
|
|
|
if group.persisted?
|
2020-06-14 20:08:43 -04:00
|
|
|
if Groups::ImportExport::ImportService.new(group: group, user: current_user).async_execute
|
|
|
|
redirect_to(
|
|
|
|
group_path(group),
|
|
|
|
notice: s_("GroupImport|Group '%{group_name}' is being imported.") % { group_name: group.name }
|
|
|
|
)
|
|
|
|
else
|
|
|
|
redirect_to group_path(group), alert: _("Group import could not be scheduled")
|
|
|
|
end
|
2020-05-21 05:08:04 -04:00
|
|
|
else
|
2021-03-02 16:11:07 -05:00
|
|
|
redirect_to new_group_path(anchor: 'import-group-pane'),
|
|
|
|
alert: s_("GroupImport|Group could not be imported: %{errors}") % { errors: group.errors.full_messages.to_sentence }
|
2020-05-21 05:08:04 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def group_params
|
|
|
|
params.permit(:path, :name, :parent_id, :file)
|
|
|
|
end
|
|
|
|
|
|
|
|
def closest_allowed_visibility_level
|
|
|
|
if group_params[:parent_id].present?
|
|
|
|
parent_group = Group.find(group_params[:parent_id])
|
|
|
|
|
|
|
|
Gitlab::VisibilityLevel.closest_allowed_level(parent_group.visibility_level)
|
|
|
|
else
|
|
|
|
Gitlab::VisibilityLevel::PRIVATE
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def ensure_group_import_enabled
|
|
|
|
render_404 unless Feature.enabled?(:group_import_export, @group, default_enabled: true)
|
|
|
|
end
|
|
|
|
|
2021-12-10 10:10:24 -05:00
|
|
|
def check_import_rate_limit!
|
|
|
|
check_rate_limit!(:group_import, scope: current_user) do
|
|
|
|
redirect_to new_group_path, alert: _('This endpoint has been requested too many times. Try again later.')
|
2020-05-21 05:08:04 -04:00
|
|
|
end
|
|
|
|
end
|
2020-11-30 22:09:24 -05:00
|
|
|
|
|
|
|
def uploader_class
|
|
|
|
ImportExportUploader
|
|
|
|
end
|
2020-12-07 19:09:45 -05:00
|
|
|
|
|
|
|
def maximum_size
|
|
|
|
Gitlab::CurrentSettings.max_import_size.megabytes
|
|
|
|
end
|
2020-05-21 05:08:04 -04:00
|
|
|
end
|