summaryrefslogtreecommitdiff
path: root/app/services/issuable/import_csv/base_service.rb
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-02-20 13:49:51 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2023-02-20 13:49:51 +0000
commit71786ddc8e28fbd3cb3fcc4b3ff15e5962a1c82e (patch)
tree6a2d93ef3fb2d353bb7739e4b57e6541f51cdd71 /app/services/issuable/import_csv/base_service.rb
parenta7253423e3403b8c08f8a161e5937e1488f5f407 (diff)
downloadgitlab-ce-a36f25615e8226344d87b692ccf3e543d5d81712.tar.gz
Add latest changes from gitlab-org/gitlab@15-9-stable-eev15.9.0-rc42
Diffstat (limited to 'app/services/issuable/import_csv/base_service.rb')
-rw-r--r--app/services/issuable/import_csv/base_service.rb80
1 files changed, 5 insertions, 75 deletions
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