diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-02-14 03:10:09 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-02-14 03:10:09 +0300 |
commit | 8aea332821a78e83ce93f5b3bac7de5f95a3c7b8 (patch) | |
tree | 722cb345de067f3b62bbe0f849178c74dec657eb /app/services | |
parent | 4f4b85e1c7f7a5518f12a6981709cf3ef3f0f653 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/services')
-rw-r--r-- | app/services/export_csv/base_service.rb | 18 | ||||
-rw-r--r-- | app/services/export_csv/map_export_fields_service.rb | 40 | ||||
-rw-r--r-- | app/services/work_items/export_csv_service.rb | 26 |
3 files changed, 79 insertions, 5 deletions
diff --git a/app/services/export_csv/base_service.rb b/app/services/export_csv/base_service.rb index 98ab33d4c33..84d44fd75fc 100644 --- a/app/services/export_csv/base_service.rb +++ b/app/services/export_csv/base_service.rb @@ -5,9 +5,10 @@ module ExportCsv # Target attachment size before base64 encoding TARGET_FILESIZE = 15.megabytes - def initialize(relation, resource_parent) + def initialize(relation, resource_parent, fields = []) @objects = relation @resource_parent = resource_parent + @fields = fields end def csv_data @@ -18,18 +19,25 @@ module ExportCsv raise NotImplementedError end + def invalid_fields + ::ExportCsv::MapExportFieldsService.new(fields, header_to_value_hash).invalid_fields + end + private - attr_reader :resource_parent, :objects + attr_reader :resource_parent, :objects, :fields # rubocop: disable CodeReuse/ActiveRecord def csv_builder - @csv_builder ||= + @csv_builder ||= begin + data_hash = MapExportFieldsService.new(fields, header_to_value_hash).execute + if preload_associations_in_batches? - CsvBuilder.new(objects, header_to_value_hash, associations_to_preload) + CsvBuilder.new(objects, data_hash, associations_to_preload) else - CsvBuilder.new(objects.preload(associations_to_preload), header_to_value_hash, []) + CsvBuilder.new(objects.preload(associations_to_preload), data_hash, []) end + end end # rubocop: enable CodeReuse/ActiveRecord diff --git a/app/services/export_csv/map_export_fields_service.rb b/app/services/export_csv/map_export_fields_service.rb new file mode 100644 index 00000000000..d4f46c65328 --- /dev/null +++ b/app/services/export_csv/map_export_fields_service.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +module ExportCsv + class MapExportFieldsService < BaseService + attr_reader :fields, :data + + def initialize(fields, data) + @fields = fields + @data = data + end + + def execute + return data if fields.empty? + + selected_fields_to_hash + end + + def invalid_fields + fields.reject { |field| permitted_field?(field) } + end + + private + + def selected_fields_to_hash + data.select { |key| requested_field?(key) } + end + + def requested_field?(field) + field.downcase.in?(fields.map(&:downcase)) + end + + def permitted_field?(field) + field.downcase.in?(keys.map(&:downcase)) + end + + def keys + data.keys + end + end +end diff --git a/app/services/work_items/export_csv_service.rb b/app/services/work_items/export_csv_service.rb new file mode 100644 index 00000000000..e0a1b90b597 --- /dev/null +++ b/app/services/work_items/export_csv_service.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module WorkItems + class ExportCsvService < ExportCsv::BaseService + def email(mail_to_user) + # TODO - will be implemented as part of https://gitlab.com/gitlab-org/gitlab/-/issues/379082 + end + + private + + def associations_to_preload + [:work_item_type, :author] + end + + def header_to_value_hash + { + 'Id' => 'iid', + 'Title' => 'title', + 'Type' => ->(work_item) { work_item.work_item_type.name }, + 'Author' => 'author_name', + 'Author Username' => ->(work_item) { work_item.author.username }, + 'Created At (UTC)' => ->(work_item) { work_item.created_at.to_s(:csv) } + } + end + end +end |