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..1ca187983 --- /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 < 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..da2680e01 --- /dev/null +++ b/app/services/oregon_digital/listeners/collection_listener.rb @@ -0,0 +1,13 @@ +# 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 + 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)