Class: Bulkrax::ValidationErrorCsvBuilder

Inherits:
Object
  • Object
show all
Defined in:
app/services/bulkrax/validation_error_csv_builder.rb

Overview

Builds a CSV string containing all validation errors from a guided import. File-level errors (missing required columns, unrecognized headers, empty columns, missing files) appear first as summary rows with a blank ‘row` cell. Row-level errors follow, one output row per errored data row.

Usage:

csv = Bulkrax::ValidationErrorCsvBuilder.build(
  headers:     result[:headers],
  csv_data:    result[:raw_csv_data],
  row_errors:  result[:rowErrors],
  file_errors: {
    missing_required: result[:missingRequired],
    unrecognized:     result[:unrecognized],
    empty_columns:    result[:emptyColumns],
    missing_files:    result[:missingFiles]
  }
)

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(headers:, csv_data:, row_errors:, file_errors:) ⇒ ValidationErrorCsvBuilder

Returns a new instance of ValidationErrorCsvBuilder.



38
39
40
41
42
43
# File 'app/services/bulkrax/validation_error_csv_builder.rb', line 38

def initialize(headers:, csv_data:, row_errors:, file_errors:)
  @headers    = headers
  @csv_data   = csv_data
  @row_errors = row_errors
  @file_errors = file_errors
end

Class Method Details

.build(headers:, csv_data:, row_errors:, file_errors: {}) ⇒ String

Returns CSV content.

Parameters:

  • headers (Array<String>)

    original CSV headers in order

  • csv_data (Array<Hash>)

    one entry per data row; each hash has :raw_row (String-keyed hash of column=>value)

  • row_errors (Array<Hash>)

    each hash has :row (Integer) and :message (String)

  • file_errors (Hash) (defaults to: {})

    file-level issues:

    • :missing_required [Array<Hash>] each hash has :model and :field

    • :unrecognized [Hash] column_name => suggestion_or_nil

    • :empty_columns [Array<Integer>] 1-based column positions with no header

    • :missing_files [Array<String>] filenames referenced but not found

Returns:

  • (String)

    CSV content



34
35
36
# File 'app/services/bulkrax/validation_error_csv_builder.rb', line 34

def self.build(headers:, csv_data:, row_errors:, file_errors: {})
  new(headers: headers, csv_data: csv_data, row_errors: row_errors, file_errors: file_errors).build
end

Instance Method Details

#buildObject



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'app/services/bulkrax/validation_error_csv_builder.rb', line 45

def build
  errors_by_row = group_errors_by_row
  blank_data    = Array.new(@headers.length)

  CSV.generate(force_quotes: false) do |csv|
    csv << ['row', 'errors'] + @headers

    file_level_error_rows.each do |message|
      csv << [nil, message] + blank_data
    end

    @csv_data.each_with_index do |record, index|
      row_number = index + 2 # header is row 1; first data row is row 2
      error_messages = errors_by_row[row_number]&.map { |e| e[:message] }&.join(' | ')
      raw_row = record[:raw_row] || {}
      csv << [row_number, error_messages] + @headers.map { |h| raw_row[h] }
    end
  end
end