diff --git a/app/factories/bulkrax/object_factory.rb b/app/factories/bulkrax/object_factory.rb index 648bffe7..f7588de5 100644 --- a/app/factories/bulkrax/object_factory.rb +++ b/app/factories/bulkrax/object_factory.rb @@ -122,7 +122,8 @@ def update def find found = find_by_id if attributes[:id].present? return found if found.present? - return search_by_identifier if attributes[work_identifier].present? + return search_by_identifier if source_identifier_value.present? + false end @@ -189,6 +190,10 @@ def log_deleted_fs(obj) Rails.logger.info("#{msg} (#{Array(attributes[work_identifier]).first})") end + def delete(_user) + find&.delete + end + private # @param [Hash] attrs the attributes to put in the environment diff --git a/app/factories/bulkrax/valkyrie_object_factory.rb b/app/factories/bulkrax/valkyrie_object_factory.rb index 6934ea6b..e1fa9f21 100644 --- a/app/factories/bulkrax/valkyrie_object_factory.rb +++ b/app/factories/bulkrax/valkyrie_object_factory.rb @@ -195,6 +195,15 @@ def destroy_existing_files @object.thumbnail_id = nil end + def delete(user) + obj = find + return false unless obj + + Hyrax.persister.delete(resource: obj) + Hyrax.index_adapter.delete(resource: obj) + Hyrax.publisher.publish('object.deleted', object: obj, user: user) + end + private # TODO: Rename to transaction_create diff --git a/app/jobs/bulkrax/delete_job.rb b/app/jobs/bulkrax/delete_job.rb index 1fcd04cc..f1c389fc 100644 --- a/app/jobs/bulkrax/delete_job.rb +++ b/app/jobs/bulkrax/delete_job.rb @@ -5,8 +5,9 @@ class DeleteJob < ApplicationJob queue_as :import def perform(entry, importer_run) - obj = entry.factory.find - obj&.delete + user = importer_run.importer.user + entry.factory.delete(user) + # rubocop:disable Rails/SkipsModelValidations ImporterRun.increment_counter(:deleted_records, importer_run.id) ImporterRun.decrement_counter(:enqueued_records, importer_run.id) diff --git a/app/parsers/bulkrax/application_parser.rb b/app/parsers/bulkrax/application_parser.rb index 5fe41fe6..f6c05c1f 100644 --- a/app/parsers/bulkrax/application_parser.rb +++ b/app/parsers/bulkrax/application_parser.rb @@ -311,6 +311,9 @@ def find_or_create_entry(entryclass, identifier, type, raw_metadata = nil) identifier: identifier ).first_or_create! entry.raw_metadata = raw_metadata + # Setting parsed_metadata specifically for the id so we can find the object via the + # id in a delete. This is likely to get clobbered in a regular import, which is fine. + entry.parsed_metadata = { id: raw_metadata['id'] } if raw_metadata&.key?('id') entry.save! entry end diff --git a/spec/jobs/bulkrax/delete_work_job_spec.rb b/spec/jobs/bulkrax/delete_work_job_spec.rb index a40c0ba4..b34d9686 100644 --- a/spec/jobs/bulkrax/delete_work_job_spec.rb +++ b/spec/jobs/bulkrax/delete_work_job_spec.rb @@ -7,14 +7,19 @@ module Bulkrax subject(:delete_work_job) { described_class.new } let(:entry) { create(:bulkrax_entry) } let(:importer_run) { create(:bulkrax_importer_run) } + let(:factory) do + Bulkrax::ObjectFactory.new(attributes: {}, + source_identifier_value: '123', + work_identifier: :source, + work_identifier_search_field: :source_identifier) + end describe 'successful job object removed' do before do work = instance_double("Work") - factory = instance_double("Bulkrax::ObjectFactory") - expect(work).to receive(:delete).and_return true - expect(factory).to receive(:find).and_return(work) - expect(entry).to receive(:factory).and_return(factory) + allow(work).to receive(:delete).and_return true + allow(factory).to receive(:find).and_return(work) + allow(entry).to receive(:factory).and_return(factory) end it 'increments :deleted_records' do @@ -31,9 +36,8 @@ module Bulkrax describe 'successful job object not found' do before do - factory = instance_double("Bulkrax::ObjectFactory") - expect(factory).to receive(:find).and_return(nil) - expect(entry).to receive(:factory).and_return(factory) + allow(factory).to receive(:find).and_return(nil) + allow(entry).to receive(:factory).and_return(factory) end it 'increments :deleted_records' do