From 8aea332821a78e83ce93f5b3bac7de5f95a3c7b8 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 14 Feb 2023 00:10:09 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- app/services/export_csv/base_service.rb | 18 +++++++--- .../export_csv/map_export_fields_service.rb | 40 ++++++++++++++++++++++ 2 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 app/services/export_csv/map_export_fields_service.rb (limited to 'app/services/export_csv') 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 -- cgit v1.2.3