From cf09552d5933b62e055d0bd3cd377173ee3df382 Mon Sep 17 00:00:00 2001 From: Aleksandar Petrushev Date: Tue, 30 Nov 2021 13:30:14 +0100 Subject: [PATCH] SD-1544 Do not emit webhooks on touch events (#11539) * Do not emit webhooks on touch events * Make check if updating timestamps only be for default events --- .../models/concerns/spree/webhooks/has_webhooks.rb | 9 +++++++-- .../concerns/spree/webhooks/has_webhooks_spec.rb | 14 +++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/api/app/models/concerns/spree/webhooks/has_webhooks.rb b/api/app/models/concerns/spree/webhooks/has_webhooks.rb index 7c08f99c799..8beb55903bb 100644 --- a/api/app/models/concerns/spree/webhooks/has_webhooks.rb +++ b/api/app/models/concerns/spree/webhooks/has_webhooks.rb @@ -9,7 +9,8 @@ module HasWebhooks after_update_commit(proc { queue_webhooks_requests!(inferred_event_name(:update)) }) def queue_webhooks_requests!(event_name) - return if disable_spree_webhooks? || updating_only_timestamps? || body.blank? + return if disable_spree_webhooks? || body.blank? + return if default_event?(event_name) && updating_only_timestamps? Spree::Webhooks::Subscribers::QueueRequests.call(body: body, event_name: event_name) end @@ -42,7 +43,11 @@ def resource_serializer end def updating_only_timestamps? - saved_changes.present? && (saved_changes.keys - %w[created_at updated_at]).empty? + (saved_changes.keys - %w[created_at updated_at deleted_at]).empty? + end + + def default_event?(event_name) + self.class.default_webhook_events.include?(event_name) end def disable_spree_webhooks? diff --git a/api/spec/models/concerns/spree/webhooks/has_webhooks_spec.rb b/api/spec/models/concerns/spree/webhooks/has_webhooks_spec.rb index 584791ed50d..26f5f77bb5f 100644 --- a/api/spec/models/concerns/spree/webhooks/has_webhooks_spec.rb +++ b/api/spec/models/concerns/spree/webhooks/has_webhooks_spec.rb @@ -107,11 +107,23 @@ context 'when using touch with an argument other than created_at/updated_at' do it do expect do - product.touch(:deleted_at) + product.touch(:available_on) end.to emit_webhook_event(event_name) end end end + + context 'on touch events from callbacks' do + let!(:store2) { create(:store) } + let!(:cms_page) { create(:cms_homepage, store: store2, locale: 'en') } + let(:body) { Spree::Api::V2::Platform::StoreSerializer.new(store2).serializable_hash } + + before { store2.changes_applied } + + it 'does not emit the touched model\'s update event' do + expect { cms_page.update(title: 'Homepage #1') }.not_to emit_webhook_event('store.update') + end + end end describe '.default_webhook_events' do