summaryrefslogtreecommitdiff
path: root/app/controllers/import/bulk_imports_controller.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/controllers/import/bulk_imports_controller.rb')
-rw-r--r--app/controllers/import/bulk_imports_controller.rb109
1 files changed, 109 insertions, 0 deletions
diff --git a/app/controllers/import/bulk_imports_controller.rb b/app/controllers/import/bulk_imports_controller.rb
new file mode 100644
index 00000000000..cb2922c2d47
--- /dev/null
+++ b/app/controllers/import/bulk_imports_controller.rb
@@ -0,0 +1,109 @@
+# frozen_string_literal: true
+
+class Import::BulkImportsController < ApplicationController
+ before_action :ensure_group_import_enabled
+ before_action :verify_blocked_uri, only: :status
+
+ feature_category :importers
+
+ rescue_from Gitlab::BulkImport::Client::ConnectionError, with: :bulk_import_connection_error
+
+ def configure
+ session[access_token_key] = params[access_token_key]&.strip
+ session[url_key] = params[url_key]
+
+ redirect_to status_import_bulk_import_url
+ end
+
+ def status
+ respond_to do |format|
+ format.json do
+ render json: { importable_data: serialized_importable_data }
+ end
+
+ format.html
+ end
+ end
+
+ private
+
+ def serialized_importable_data
+ serializer.represent(importable_data, {}, Import::BulkImportEntity)
+ end
+
+ def serializer
+ @serializer ||= BaseSerializer.new(current_user: current_user)
+ end
+
+ def importable_data
+ client.get('groups', top_level_only: true)
+ end
+
+ def client
+ @client ||= Gitlab::BulkImport::Client.new(
+ uri: session[url_key],
+ token: session[access_token_key]
+ )
+ end
+
+ def import_params
+ params.permit(access_token_key, url_key)
+ end
+
+ def ensure_group_import_enabled
+ render_404 unless Feature.enabled?(:bulk_import)
+ end
+
+ def access_token_key
+ :bulk_import_gitlab_access_token
+ end
+
+ def url_key
+ :bulk_import_gitlab_url
+ end
+
+ def verify_blocked_uri
+ Gitlab::UrlBlocker.validate!(
+ session[url_key],
+ **{
+ allow_localhost: allow_local_requests?,
+ allow_local_network: allow_local_requests?,
+ schemes: %w(http https)
+ }
+ )
+ rescue Gitlab::UrlBlocker::BlockedUrlError => e
+ clear_session_data
+
+ redirect_to new_group_path, alert: _('Specified URL cannot be used: "%{reason}"') % { reason: e.message }
+ end
+
+ def allow_local_requests?
+ Gitlab::CurrentSettings.allow_local_requests_from_web_hooks_and_services?
+ end
+
+ def bulk_import_connection_error(error)
+ clear_session_data
+
+ error_message = _("Unable to connect to server: %{error}") % { error: error }
+ flash[:alert] = error_message
+
+ respond_to do |format|
+ format.json do
+ render json: {
+ error: {
+ message: error_message,
+ redirect: new_group_path
+ }
+ }, status: :unprocessable_entity
+ end
+ format.html do
+ redirect_to new_group_path
+ end
+ end
+ end
+
+ def clear_session_data
+ session[url_key] = nil
+ session[access_token_key] = nil
+ end
+end