From 28512a8590da027d6b23aabe5af725c3e6fa7a8e Mon Sep 17 00:00:00 2001 From: Jared Norman Date: Thu, 23 Apr 2026 13:22:30 +0900 Subject: [PATCH] Only fire order recalculated event after save The events should be published only once the transaction has completed, so any jobs fired from subscribers see the new version of the order. Also, the event bus has a job-backed backend (that I'm not sure anyone uses) so this should also fix race conditions with that. Besides fixing race conditions with subscribers, this also ensure we don't fire the event when the order is *not* being persisted. (cherry picked from commit 9a2cda19f353a7dbee26769f068533b6b85d4372) --- core/app/models/spree/in_memory_order_updater.rb | 4 ++-- core/app/models/spree/order_updater.rb | 2 +- core/spec/models/spree/in_memory_order_updater_spec.rb | 6 ++++++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core/app/models/spree/in_memory_order_updater.rb b/core/app/models/spree/in_memory_order_updater.rb index 172a4c603b..8d10f7ef5f 100644 --- a/core/app/models/spree/in_memory_order_updater.rb +++ b/core/app/models/spree/in_memory_order_updater.rb @@ -53,10 +53,10 @@ def recalculate(persist: true) end end - Spree::Bus.publish(:order_recalculated, order:) - persist_totals if persist end + + Spree::Bus.publish(:order_recalculated, order:) if persist end alias_method :update, :recalculate deprecate update: :recalculate, deprecator: Spree.deprecator diff --git a/core/app/models/spree/order_updater.rb b/core/app/models/spree/order_updater.rb index d5200ff3ed..063968ad22 100644 --- a/core/app/models/spree/order_updater.rb +++ b/core/app/models/spree/order_updater.rb @@ -27,9 +27,9 @@ def recalculate update_shipments recalculate_shipment_state end - Spree::Bus.publish(:order_recalculated, order:) persist_totals end + Spree::Bus.publish(:order_recalculated, order:) end alias_method :update, :recalculate deprecate update: :recalculate, deprecator: Spree.deprecator diff --git a/core/spec/models/spree/in_memory_order_updater_spec.rb b/core/spec/models/spree/in_memory_order_updater_spec.rb index c23ba7cb7e..80ff30bcda 100644 --- a/core/spec/models/spree/in_memory_order_updater_spec.rb +++ b/core/spec/models/spree/in_memory_order_updater_spec.rb @@ -632,6 +632,12 @@ module Spree expect(item).to have_received(:do_something) end + + it "does not fire the event when persist: false" do + updater.recalculate(persist: false) + + expect(item).not_to have_received(:do_something) + end end context "with invalid associated objects" do