From e00fd94db79a9733e68c569f8476bba02fe00b40 Mon Sep 17 00:00:00 2001 From: Adam Ploshay Date: Thu, 30 May 2024 08:50:10 -0400 Subject: [PATCH] import ImportFileSetJob from bulkrax 5.5.1 --- app/jobs/bulkrax/import_file_set_job.rb | 74 +++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 app/jobs/bulkrax/import_file_set_job.rb diff --git a/app/jobs/bulkrax/import_file_set_job.rb b/app/jobs/bulkrax/import_file_set_job.rb new file mode 100644 index 000000000..b29c57bbb --- /dev/null +++ b/app/jobs/bulkrax/import_file_set_job.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +module Bulkrax + class MissingParentError < ::StandardError; end + + class ImportFileSetJob < ApplicationJob + include DynamicRecordLookup + + queue_as Bulkrax.config.ingest_queue_name + + attr_reader :importer_run_id + + def perform(entry_id, importer_run_id) + @importer_run_id = importer_run_id + entry = Entry.find(entry_id) + # e.g. "parents" or "parents_1" + parent_identifier = (entry.raw_metadata[entry.related_parents_raw_mapping] || entry.raw_metadata["#{entry.related_parents_raw_mapping}_1"])&.strip + + validate_parent!(parent_identifier) + + entry.build + if entry.succeeded? + # rubocop:disable Rails/SkipsModelValidations + ImporterRun.increment_counter(:processed_records, importer_run_id) + ImporterRun.increment_counter(:processed_file_sets, importer_run_id) + else + ImporterRun.increment_counter(:failed_records, importer_run_id) + ImporterRun.increment_counter(:failed_file_sets, importer_run_id) + # rubocop:enable Rails/SkipsModelValidations + end + ImporterRun.decrement_counter(:enqueued_records, importer_run_id) unless ImporterRun.find(importer_run_id).enqueued_records <= 0 # rubocop:disable Rails/SkipsModelValidations + entry.save! + entry.importer.current_run = ImporterRun.find(importer_run_id) + entry.importer.record_status + + rescue MissingParentError => e + # try waiting for the parent record to be created + entry.import_attempts += 1 + entry.save! + if entry.import_attempts < 5 + ImportFileSetJob.set(wait: (entry.import_attempts + 1).minutes).perform_later(entry_id, importer_run_id) + else + ImporterRun.decrement_counter(:enqueued_records, importer_run_id) # rubocop:disable Rails/SkipsModelValidations + entry.set_status_info(e) + end + end + + private + + attr_reader :parent_record + + def validate_parent!(parent_identifier) + # if parent_identifier is missing, it will be caught by #validate_presence_of_parent! + return if parent_identifier.blank? + + find_parent_record(parent_identifier) + check_parent_exists!(parent_identifier) + check_parent_is_a_work!(parent_identifier) + end + + def check_parent_exists!(parent_identifier) + raise MissingParentError, %(Unable to find a record with the identifier "#{parent_identifier}") if parent_record.nil? + end + + def check_parent_is_a_work!(parent_identifier) + error_msg = %(A record with the ID "#{parent_identifier}" was found, but it was a #{parent_record.class}, which is not an valid/available work type) + raise ::StandardError, error_msg unless curation_concern?(parent_record) + end + + def find_parent_record(parent_identifier) + _, @parent_record = find_record(parent_identifier, importer_run_id) + end + end +end