From 9dab490b88c336708518d0bf2095bab2974a7a4e Mon Sep 17 00:00:00 2001 From: lsat12357 Date: Wed, 17 Jun 2026 06:30:33 -0700 Subject: [PATCH 1/3] log coll events --- .../collections_controller_behavior.rb | 27 +++++++++++++++++++ app/jobs/collection_event_job.rb | 21 +++++++++++++++ .../collection_permission_change_event_job.rb | 8 ++++++ app/jobs/collection_update_event_job.rb | 8 ++++++ app/models/collection.rb | 1 + .../listeners/collection_listener.rb | 17 ++++++++++++ .../hacks/hyrax_collections_controller.rb | 7 ++++- .../initializers/oregon_digital_listeners.rb | 3 ++- 8 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 app/controllers/concerns/oregon_digital/collections_controller_behavior.rb create mode 100644 app/jobs/collection_event_job.rb create mode 100644 app/jobs/collection_permission_change_event_job.rb create mode 100644 app/jobs/collection_update_event_job.rb create mode 100644 app/services/oregon_digital/listeners/collection_listener.rb diff --git a/app/controllers/concerns/oregon_digital/collections_controller_behavior.rb b/app/controllers/concerns/oregon_digital/collections_controller_behavior.rb new file mode 100644 index 000000000..e16ed56a9 --- /dev/null +++ b/app/controllers/concerns/oregon_digital/collections_controller_behavior.rb @@ -0,0 +1,27 @@ +# frozen_string_literal:true + +module OregonDigital + # permission methods adapted from Hyrax::WorksControllerBehavior + # in order to capture permissions changed events + module CollectionsControllerBehavior + def save_permissions + @saved_permissions = + case collection + when ActiveFedora::Base + collection.permissions.map(&:to_hash) + else + Hyrax::AccessControl.for(resource: collection).permissions + end + end + + def permissions_changed? + @saved_permissions != + case collection + when ActiveFedora::Base + collection.permissions.map(&:to_hash) + else + Hyrax::AccessControl.for(resource: collection).permissions + end + end + end +end diff --git a/app/jobs/collection_event_job.rb b/app/jobs/collection_event_job.rb new file mode 100644 index 000000000..37f9cb137 --- /dev/null +++ b/app/jobs/collection_event_job.rb @@ -0,0 +1,21 @@ +# frozen_string_literal:true + +# Similar to work event jobs except collections cannot be passed in +class CollectionEventJob < Hyrax::EventJob + attr_reader :collection + def perform(collid, depositor) + @collection = Collection.find(collid) + super(depositor) + log_event(collection) + end + + # Log the event to the object's stream + def log_event(collection) + collection.log_event(event) + end + + # log the event to the users profile stream + def log_user_event(depositor) + depositor.log_profile_event(event) + end +end diff --git a/app/jobs/collection_permission_change_event_job.rb b/app/jobs/collection_permission_change_event_job.rb new file mode 100644 index 000000000..f9b07e878 --- /dev/null +++ b/app/jobs/collection_permission_change_event_job.rb @@ -0,0 +1,8 @@ +# frozen_string_literal:true + +# Provides a permission change message for collections +class CollectionPermissionChangeEventJob < CollectionEventJob + def action + "User #{link_to_profile depositor} has updated permission of #{link_to collection.title.first, Hyrax::Engine.routes.url_helpers.polymorphic_path(collection)} to #{visibility_badge(collection.visibility)}" + end +end diff --git a/app/jobs/collection_update_event_job.rb b/app/jobs/collection_update_event_job.rb new file mode 100644 index 000000000..f2683759d --- /dev/null +++ b/app/jobs/collection_update_event_job.rb @@ -0,0 +1,8 @@ +# frozen_string_literal:true + +# Provides a catch-all update message +class CollectionUpdateEventJob < CollectionEventJob + def action + "User #{link_to_profile depositor} has updated #{link_to collection.title.first, Hyrax::Engine.routes.url_helpers.polymorphic_path(collection)}" + end +end diff --git a/app/models/collection.rb b/app/models/collection.rb index 187dad520..d1ace3dec 100644 --- a/app/models/collection.rb +++ b/app/models/collection.rb @@ -11,6 +11,7 @@ class Collection < ActiveFedora::Base include OregonDigital::CollectionMetadata include OregonDigital::MetadataDownload include OregonDigital::AccessControls::Visibility + include Hyrax::WithEvents self.indexer = OregonDigital::CollectionIndexer delegate :facet_configurable?, to: :collection_type diff --git a/app/services/oregon_digital/listeners/collection_listener.rb b/app/services/oregon_digital/listeners/collection_listener.rb new file mode 100644 index 000000000..85093a99f --- /dev/null +++ b/app/services/oregon_digital/listeners/collection_listener.rb @@ -0,0 +1,17 @@ +# frozen_string_literal:true + +module OregonDigital + module Listeners + # Listens for published collection events + class CollectionListener + # currently, collections do not have global id, and therefore cannot be passed to jobs + def on_collection_metadata_updated(event) + CollectionUpdateEventJob.perform_later(event[:collection].id, event[:user]) + end + + def on_collection_metadata_created(event) + CollectionCreateEventJob.perform_later(event[:collection].id, event[:user]) + end + end + end +end diff --git a/config/initializers/hacks/hyrax_collections_controller.rb b/config/initializers/hacks/hyrax_collections_controller.rb index 2a066a46a..fcfb23767 100644 --- a/config/initializers/hacks/hyrax_collections_controller.rb +++ b/config/initializers/hacks/hyrax_collections_controller.rb @@ -8,6 +8,7 @@ end Hyrax::Dashboard::CollectionsController.class_eval do + include OregonDigital::CollectionsControllerBehavior self.form_class = OregonDigital::Forms::CollectionForm self.presenter_class = OregonDigital::CollectionPresenter @@ -29,7 +30,8 @@ def update_active_fedora_collection process_branding process_facets if collection.facet_configurable? && !params[:facet_configuration].blank? process_representative_images - + # will need to save permissions on valkyrie colls eventually + save_permissions @collection.visibility = Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PRIVATE unless Hyrax::CollectionType.for(collection: @collection).discoverable? if @collection.update(collection_params.except(:members)) after_update_response @@ -67,6 +69,9 @@ def after_create_response # Override after update method to redirect users back to where they updated the collection from def after_update_response + Hyrax.publisher.publish('collection.metadata.updated', collection: @collection, user: current_user) + # copying strategy for works permission change logging, enqueue job directly without pub/listen + OregonDigital::CollectionPermissionChangeEventJob.perform_later(collection.id, current_user) if permissions_changed? respond_to do |format| format.html do case URI(request.referer).path.split('/')[1] diff --git a/config/initializers/oregon_digital_listeners.rb b/config/initializers/oregon_digital_listeners.rb index c6473ea79..1a13f9b40 100644 --- a/config/initializers/oregon_digital_listeners.rb +++ b/config/initializers/oregon_digital_listeners.rb @@ -1 +1,2 @@ -Hyrax.publisher.subscribe(OregonDigital::Listeners::MetadataFetchListener.new) \ No newline at end of file +Hyrax.publisher.subscribe(OregonDigital::Listeners::MetadataFetchListener.new) +Hyrax.publisher.subscribe(OregonDigital::Listeners::CollectionListener.new) From 35c5c26f19ad9b2bb693de5961ea628d3db8afb8 Mon Sep 17 00:00:00 2001 From: lsat12357 Date: Wed, 17 Jun 2026 09:22:06 -0700 Subject: [PATCH 2/3] update only --- app/services/oregon_digital/listeners/collection_listener.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/services/oregon_digital/listeners/collection_listener.rb b/app/services/oregon_digital/listeners/collection_listener.rb index 85093a99f..da2680e01 100644 --- a/app/services/oregon_digital/listeners/collection_listener.rb +++ b/app/services/oregon_digital/listeners/collection_listener.rb @@ -8,10 +8,6 @@ class CollectionListener def on_collection_metadata_updated(event) CollectionUpdateEventJob.perform_later(event[:collection].id, event[:user]) end - - def on_collection_metadata_created(event) - CollectionCreateEventJob.perform_later(event[:collection].id, event[:user]) - end end end end From 8a34d9dfed4cd14cb8481a48e60dd5e03d0193ee Mon Sep 17 00:00:00 2001 From: lsat12357 Date: Thu, 18 Jun 2026 09:10:27 -0700 Subject: [PATCH 3/3] fix constant --- app/jobs/collection_event_job.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/jobs/collection_event_job.rb b/app/jobs/collection_event_job.rb index 37f9cb137..1ca187983 100644 --- a/app/jobs/collection_event_job.rb +++ b/app/jobs/collection_event_job.rb @@ -1,7 +1,7 @@ # frozen_string_literal:true # Similar to work event jobs except collections cannot be passed in -class CollectionEventJob < Hyrax::EventJob +class CollectionEventJob < EventJob attr_reader :collection def perform(collid, depositor) @collection = Collection.find(collid)