Sha256: 83ae28d6b2ea4a17147838a497c93069de58e46f00418f559a1ca892f18309bc

Contents?: true

Size: 1.54 KB

Versions: 3

Compression:

Stored size: 1.54 KB

Contents

# frozen_string_literal: true

module Spotlight
  ##
  # Process a CSV upload into new Spotlight::Resource::Upload objects
  class AddUploadsFromCsv < ActiveJob::Base
    attr_reader :count
    attr_reader :errors

    queue_as :default

    after_perform do |job|
      csv_data, exhibit, user = job.arguments
      Spotlight::IndexingCompleteMailer.documents_indexed(
        csv_data,
        exhibit,
        user,
        indexed_count: job.count,
        errors: job.errors
      ).deliver_now
    end

    def perform(csv_data, exhibit, _user)
      @count = 0
      @errors = {}

      resources(csv_data, exhibit).each_with_index do |resource, index|
        if resource.save_and_index
          @count += 1
        else
          @errors[index + 1] = resource.errors.full_messages + resource.upload&.errors&.full_messages
        end
      end
    end

    private

    def resources(csv_data, exhibit)
      return to_enum(:resources, csv_data, exhibit) unless block_given?

      encoded_csv(csv_data).each do |row|
        url = row.delete('url')
        next unless url.present?

        resource = Spotlight::Resources::Upload.new(
          data: row,
          exhibit: exhibit
        )
        resource.build_upload(remote_image_url: url) unless url == '~'

        yield resource
      end
    end

    def encoded_csv(csv)
      csv.map do |row|
        row.map do |label, column|
          [label, column.encode('UTF-8', invalid: :replace, undef: :replace, replace: "\uFFFD")] if column.present?
        end.compact.to_h
      end.compact
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
blacklight-spotlight-3.0.0.rc3 app/jobs/spotlight/add_uploads_from_csv.rb
blacklight-spotlight-3.0.0.rc2 app/jobs/spotlight/add_uploads_from_csv.rb
blacklight-spotlight-3.0.0.rc1 app/jobs/spotlight/add_uploads_from_csv.rb