summaryrefslogtreecommitdiff
path: root/app/services/import/gitlab_projects/create_project_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/import/gitlab_projects/create_project_service.rb')
-rw-r--r--app/services/import/gitlab_projects/create_project_service.rb81
1 files changed, 81 insertions, 0 deletions
diff --git a/app/services/import/gitlab_projects/create_project_service.rb b/app/services/import/gitlab_projects/create_project_service.rb
new file mode 100644
index 00000000000..1613c4dde25
--- /dev/null
+++ b/app/services/import/gitlab_projects/create_project_service.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+# Creates a new project with an associated project export file to be imported
+# The associated project export file might be associated with different strategies
+# to acquire the file to be imported, the default file_acquisition_strategy
+# is uploading a file (Import::GitlabProjects::FileAcquisitionStrategies::FileUpload)
+module Import
+ module GitlabProjects
+ class CreateProjectService
+ include ActiveModel::Validations
+ include ::Services::ReturnServiceResponses
+
+ validates_presence_of :path, :namespace
+
+ # Creates a new CreateProjectService.
+ #
+ # @param [User] current_user
+ # @param [Hash] :params
+ # @param [Import::GitlabProjects::FileAcquisitionStrategies::*] :file_acquisition_strategy
+ def initialize(current_user, params:, file_acquisition_strategy: FileAcquisitionStrategies::FileUpload)
+ @current_user = current_user
+ @params = params.dup
+ @strategy = file_acquisition_strategy.new(current_user: current_user, params: params)
+ end
+
+ # Creates a project with the strategy parameters
+ #
+ # @return [Services::ServiceReponse]
+ def execute
+ return error(errors.full_messages) unless valid?
+ return error(project.errors.full_messages) unless project.saved?
+
+ success(project)
+ rescue StandardError => e
+ error(e.message)
+ end
+
+ # Cascade the validation to strategy
+ def valid?
+ super && strategy.valid?
+ end
+
+ # Merge with strategy's errors
+ def errors
+ super.tap { _1.merge!(strategy.errors) }
+ end
+
+ def read_attribute_for_validation(key)
+ params[key]
+ end
+
+ private
+
+ attr_reader :current_user, :params, :strategy
+
+ def error(messages)
+ messages = Array.wrap(messages)
+ message = messages.shift
+ super(message, :bad_request, pass_back: { other_errors: messages })
+ end
+
+ def project
+ @project ||= ::Projects::GitlabProjectsImportService.new(
+ current_user,
+ project_params,
+ params[:override]
+ ).execute
+ end
+
+ def project_params
+ {
+ name: params[:name],
+ path: params[:path],
+ namespace_id: params[:namespace].id,
+ overwrite: params[:overwrite],
+ import_type: 'gitlab_project'
+ }.merge(strategy.project_params)
+ end
+ end
+ end
+end