diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-06-18 14:18:50 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-06-18 14:18:50 +0300 |
commit | 8c7f4e9d5f36cff46365a7f8c4b9c21578c1e781 (patch) | |
tree | a77e7fe7a93de11213032ed4ab1f33a3db51b738 /app/controllers/import/gitlab_groups_controller.rb | |
parent | 00b35af3db1abfe813a778f643dad221aad51fca (diff) |
Add latest changes from gitlab-org/gitlab@13-1-stable-ee
Diffstat (limited to 'app/controllers/import/gitlab_groups_controller.rb')
-rw-r--r-- | app/controllers/import/gitlab_groups_controller.rb | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/app/controllers/import/gitlab_groups_controller.rb b/app/controllers/import/gitlab_groups_controller.rb new file mode 100644 index 00000000000..330af68385e --- /dev/null +++ b/app/controllers/import/gitlab_groups_controller.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +class Import::GitlabGroupsController < ApplicationController + include WorkhorseImportExportUpload + + before_action :ensure_group_import_enabled + before_action :import_rate_limit, only: %i[create] + + def create + unless file_is_valid?(group_params[:file]) + return redirect_back_or_default(options: { alert: s_('GroupImport|Unable to process group import file') }) + 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? + 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 + else + redirect_back_or_default( + options: { alert: s_("GroupImport|Group could not be imported: %{errors}") % { errors: group.errors.full_messages.to_sentence } } + ) + 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 + + def import_rate_limit + if Gitlab::ApplicationRateLimiter.throttled?(:group_import, scope: current_user) + Gitlab::ApplicationRateLimiter.log_request(request, :group_import_request_limit, current_user) + + flash[:alert] = _('This endpoint has been requested too many times. Try again later.') + redirect_to new_group_path + end + end +end |