Skip to content

Commit

Permalink
Repurpose MemberCleanupListener for parent/child
Browse files Browse the repository at this point in the history
This commit will repurpose the `MemberCleanupListener` to be used for
cleaning up parent/child relationships.  When the child is deleted, the
parent will be updated to remove the child id from its #member_ids.
  • Loading branch information
kirkkwang authored and tamsin woo committed Feb 7, 2024
1 parent 182270d commit 89b3205
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 8 deletions.
14 changes: 13 additions & 1 deletion app/services/hyrax/listeners/member_cleanup_listener.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,19 @@ class MemberCleanupListener
# Called when 'object.deleted' event is published
# @param [Dry::Events::Event] event
# @return [void]
def on_object_deleted(event); end
def on_object_deleted(event)
event = event.to_h
return unless event[:object]

object = event[:object]
return unless object.is_a?(Hyrax::Work)

Hyrax.query_service.find_parents(resource: object).each do |parent|
parent.member_ids -= [object.id]
Hyrax.persister.save(resource: parent)
Hyrax.index_adapter.save(resource: parent)
end
end

# Called when 'collection.deleted' event is published
# @param [Dry::Events::Event] event
Expand Down
18 changes: 11 additions & 7 deletions spec/services/hyrax/listeners/member_cleanup_listener_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,20 @@
after { Hyrax.publisher.unsubscribe(spy_listener) }

describe '#on_object_deleted' do
let(:data) { { object: work, user: user } }
let(:data) { { object: child_work, user: user } }
let(:event_type) { :on_object_deleted }
let(:work) { FactoryBot.valkyrie_create(:hyrax_work, member_ids: [file_set.id]) }
let(:file_set) { FactoryBot.valkyrie_create(:hyrax_file_set) }
let(:child_work) { FactoryBot.valkyrie_create(:hyrax_work) }
let(:parent_work) { FactoryBot.valkyrie_create(:hyrax_work) }

# exited because we have moved the logic to a transaction
xit 'publishes events' do
before do
parent_work.member_ids << child_work.id
Hyrax.persister.save(resource: parent_work)
end

it "removes the child work id from the parent works' #member_ids" do
expect(Hyrax.query_service.find_by(id: parent_work.id).member_ids).to be_present
listener.on_object_deleted(event)
expect(spy_listener.object_deleted&.payload)
.to include(id: file_set.id, object: file_set, user: user)
expect(Hyrax.query_service.find_by(id: parent_work.id).member_ids).to be_empty
end
end

Expand Down

0 comments on commit 89b3205

Please sign in to comment.