Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-02-01 00:07:40 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-02-01 00:07:40 +0300
commit9e83d078577a9c066f21fcef1355f800ad895c9c (patch)
tree8995c5868449584040e58400ae2bcb9f48346fb3 /app/services
parent22dde36e800253350e5fa1d902f191a7f64bc6e9 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services')
-rw-r--r--app/services/import_csv/base_service.rb99
-rw-r--r--app/services/issuable/import_csv/base_service.rb80
-rw-r--r--app/services/issues/import_csv_service.rb8
-rw-r--r--app/services/jira_connect_installations/update_service.rb2
4 files changed, 109 insertions, 80 deletions
diff --git a/app/services/import_csv/base_service.rb b/app/services/import_csv/base_service.rb
new file mode 100644
index 00000000000..fd75a251dd2
--- /dev/null
+++ b/app/services/import_csv/base_service.rb
@@ -0,0 +1,99 @@
+# frozen_string_literal: true
+
+module ImportCsv
+ class BaseService
+ def initialize(user, project, csv_io)
+ @user = user
+ @project = project
+ @csv_io = csv_io
+ @results = { success: 0, error_lines: [], parse_error: false }
+ end
+
+ def execute
+ process_csv
+ email_results_to_user
+
+ results
+ end
+
+ def email_results_to_user
+ raise NotImplementedError
+ end
+
+ private
+
+ attr_reader :user, :project, :csv_io, :results
+
+ def attributes_for(row)
+ raise NotImplementedError
+ end
+
+ def validate_headers_presence!(headers)
+ raise NotImplementedError
+ end
+
+ def create_object_class
+ raise NotImplementedError
+ end
+
+ def process_csv
+ with_csv_lines.each do |row, line_no|
+ attributes = attributes_for(row)
+
+ if create_object(attributes)&.persisted?
+ results[:success] += 1
+ else
+ results[:error_lines].push(line_no)
+ end
+ end
+ rescue ArgumentError, CSV::MalformedCSVError
+ results[:parse_error] = true
+ end
+
+ def with_csv_lines
+ csv_data = @csv_io.open(&:read).force_encoding(Encoding::UTF_8)
+ validate_headers_presence!(csv_data.lines.first)
+
+ CSV.new(
+ csv_data,
+ col_sep: detect_col_sep(csv_data.lines.first),
+ headers: true,
+ header_converters: :symbol
+ ).each.with_index(2)
+ end
+
+ def detect_col_sep(header)
+ if header.include?(",")
+ ","
+ elsif header.include?(";")
+ ";"
+ elsif header.include?("\t")
+ "\t"
+ else
+ raise CSV::MalformedCSVError.new('Invalid CSV format', 1)
+ end
+ end
+
+ def create_object(attributes)
+ # NOTE: CSV imports are performed by workers, so we do not have a request context in order
+ # to create a SpamParams object to pass to the issuable create service.
+ spam_params = nil
+
+ # default_params can be extracted into a method if we need
+ # to support creation of objects that belongs to groups.
+ default_params = { project: project,
+ current_user: user,
+ params: attributes,
+ spam_params: spam_params }
+
+ create_service = create_object_class.new(**default_params.merge(extra_create_service_params))
+
+ create_service.execute_without_rate_limiting
+ end
+
+ # Overidden in subclasses to support specific parameters
+ def extra_create_service_params
+ {}
+ end
+ end
+end
diff --git a/app/services/issuable/import_csv/base_service.rb b/app/services/issuable/import_csv/base_service.rb
index e84d1032e41..83cf5a67453 100644
--- a/app/services/issuable/import_csv/base_service.rb
+++ b/app/services/issuable/import_csv/base_service.rb
@@ -2,38 +2,13 @@
module Issuable
module ImportCsv
- class BaseService
- def initialize(user, project, csv_io)
- @user = user
- @project = project
- @csv_io = csv_io
- @results = { success: 0, error_lines: [], parse_error: false }
- end
-
- def execute
- process_csv
- email_results_to_user
-
- @results
- end
+ class BaseService < ::ImportCsv::BaseService
+ extend ::Gitlab::Utils::Override
private
- def process_csv
- with_csv_lines.each do |row, line_no|
- attributes = issuable_attributes_for(row)
-
- if create_issuable(attributes)&.persisted?
- @results[:success] += 1
- else
- @results[:error_lines].push(line_no)
- end
- end
- rescue ArgumentError, CSV::MalformedCSVError
- @results[:parse_error] = true
- end
-
- def issuable_attributes_for(row)
+ override :attributes_for
+ def attributes_for(row)
{
title: row[:title],
description: row[:description],
@@ -41,58 +16,13 @@ module Issuable
}
end
- def with_csv_lines
- csv_data = @csv_io.open(&:read).force_encoding(Encoding::UTF_8)
- validate_headers_presence!(csv_data.lines.first)
-
- CSV.new(
- csv_data,
- col_sep: detect_col_sep(csv_data.lines.first),
- headers: true,
- header_converters: :symbol
- ).each.with_index(2)
- end
-
+ override :validate_headers_presence!
def validate_headers_presence!(headers)
headers.downcase! if headers
return if headers && headers.include?('title') && headers.include?('description')
raise CSV::MalformedCSVError
end
-
- def detect_col_sep(header)
- if header.include?(",")
- ","
- elsif header.include?(";")
- ";"
- elsif header.include?("\t")
- "\t"
- else
- raise CSV::MalformedCSVError
- end
- end
-
- def create_issuable(attributes)
- # NOTE: CSV imports are performed by workers, so we do not have a request context in order
- # to create a SpamParams object to pass to the issuable create service.
- spam_params = nil
- create_service = create_issuable_class.new(project: @project, current_user: @user, params: attributes, spam_params: spam_params)
-
- # For now, if create_issuable_class prepends RateLimitedService let's bypass rate limiting
- if create_issuable_class < RateLimitedService
- create_service.execute_without_rate_limiting
- else
- create_service.execute
- end
- end
-
- def email_results_to_user
- # defined in ImportCsvService
- end
-
- def create_issuable_class
- # defined in ImportCsvService
- end
end
end
end
diff --git a/app/services/issues/import_csv_service.rb b/app/services/issues/import_csv_service.rb
index 83e550583f6..c3d6af952b4 100644
--- a/app/services/issues/import_csv_service.rb
+++ b/app/services/issues/import_csv_service.rb
@@ -9,21 +9,21 @@ module Issues
end
def email_results_to_user
- Notify.import_issues_csv_email(@user.id, @project.id, @results).deliver_later
+ Notify.import_issues_csv_email(user.id, project.id, results).deliver_later
end
private
- def create_issuable(attributes)
+ def create_object(attributes)
super[:issue]
end
- def create_issuable_class
+ def create_object_class
Issues::CreateService
end
def record_import_attempt
- Issues::CsvImport.create!(user: @user, project: @project)
+ Issues::CsvImport.create!(user: user, project: project)
end
end
end
diff --git a/app/services/jira_connect_installations/update_service.rb b/app/services/jira_connect_installations/update_service.rb
index b2b6f2a91f2..ff5b9671e2b 100644
--- a/app/services/jira_connect_installations/update_service.rb
+++ b/app/services/jira_connect_installations/update_service.rb
@@ -24,7 +24,7 @@ module JiraConnectInstallations
end
end
- send_uninstalled_hook if instance_url_changed?
+ send_uninstalled_hook if instance_url_changed? && @installation.instance_url.blank?
ServiceResponse.new(status: :success)
end