lib/hyrax/transactions/steps/save.rb in hyrax-3.3.0 vs lib/hyrax/transactions/steps/save.rb in hyrax-3.4.0

- old
+ new

@@ -15,12 +15,13 @@ class Save include Dry::Monads[:result] ## # @params [#save] persister - def initialize(persister: Hyrax.persister) + def initialize(persister: Hyrax.persister, publisher: Hyrax.publisher) @persister = persister + @publisher = publisher end ## # @param [Hyrax::ChangeSet] change_set # @param [::User, nil] user @@ -28,10 +29,11 @@ # @return [Dry::Monads::Result] `Success(work)` if the change_set is # applied and the resource is saved; # `Failure([#to_s, change_set.resource])`, otherwise. def call(change_set, user: nil) begin + new_collections = changed_collection_membership(change_set) unsaved = change_set.sync saved = @persister.save(resource: unsaved) rescue StandardError => err return Failure(["Failed save on #{change_set}\n\t#{err.message}", change_set.resource]) end @@ -41,21 +43,37 @@ saved.permission_manager.acl.permissions = unsaved.permission_manager.acl.permissions if unsaved.respond_to?(:permission_manager) user ||= ::User.find_by_user_key(saved.depositor) - publish_changes(resource: saved, user: user, new: unsaved.new_record) + publish_changes(resource: saved, user: user, new: unsaved.new_record, new_collections: new_collections) Success(saved) end private - def publish_changes(resource:, user:, new: false) + ## + # @param [Hyrax::ChangeSet] change_set + # + # @return [Array<Valkyrie::ID>] + def changed_collection_membership(change_set) + return [] unless change_set.changed?(:member_of_collection_ids) + + change_set.member_of_collection_ids - change_set.model.member_of_collection_ids + end + + def publish_changes(resource:, user:, new: false, new_collections: []) if resource.collection? - Hyrax.publisher.publish('collection.metadata.updated', collection: resource, user: user) + @publisher.publish('collection.metadata.updated', collection: resource, user: user) else - Hyrax.publisher.publish('object.deposited', object: resource, user: user) if new - Hyrax.publisher.publish('object.metadata.updated', object: resource, user: user) + @publisher.publish('object.deposited', object: resource, user: user) if new + @publisher.publish('object.metadata.updated', object: resource, user: user) + end + + new_collections.each do |collection_id| + @publisher.publish('collection.membership.updated', + collection_id: collection_id, + user: user) end end end end end