Remove callbacks in Adjustment that call order.update!

This commit is contained in:
Matt-Yorkley
2021-03-07 14:35:47 +00:00
parent 791a47d170
commit 4c64aaed77
8 changed files with 16 additions and 55 deletions

View File

@@ -4,29 +4,23 @@ class CartController < BaseController
def populate
order = current_order(true)
# Without intervention, the Spree::Adjustment#update_adjustable callback is called many times
# during cart population, for both taxation and enterprise fees. This operation triggers a
# costly Spree::Order#update!, which only needs to be run once. We avoid this by disabling
# callbacks on Spree::Adjustment and then manually invoke Spree::Order#update! on success.
Spree::Adjustment.without_callbacks do
cart_service = CartService.new(order)
cart_service = CartService.new(order)
cart_service.populate(params.slice(:variants, :quantity), true)
if cart_service.valid?
order.recreate_all_fees!
order.cap_quantity_at_stock!
order.update!
cart_service.populate(params.slice(:variants, :quantity), true)
if cart_service.valid?
order.cap_quantity_at_stock!
order.recreate_all_fees!
variant_ids = variant_ids_in(cart_service.variants_h)
variant_ids = variant_ids_in(cart_service.variants_h)
render json: { error: false,
stock_levels: VariantsStockLevels.new.call(order, variant_ids) },
status: :ok
else
render json: { error: cart_service.errors.full_messages.join(",") },
status: :precondition_failed
end
render json: { error: false,
stock_levels: VariantsStockLevels.new.call(order, variant_ids) },
status: :ok
else
render json: { error: cart_service.errors.full_messages.join(",") },
status: :precondition_failed
end
populate_variant_attributes
end

View File

@@ -36,7 +36,6 @@ module Spree
def update
@order.recreate_all_fees!
@order.update!
unless order_params.present? && @order.update(order_params) && @order.line_items.present?
if @order.line_items.empty?

View File

@@ -47,9 +47,6 @@ module Spree
validates :label, presence: true
validates :amount, numericality: true
after_save :update_adjustable
after_destroy :update_adjustable
state_machine :state, initial: :open do
event :close do
transition from: :open, to: :closed
@@ -144,29 +141,11 @@ module Spree
included_tax.positive?
end
def self.without_callbacks
skip_callback :save, :after, :update_adjustable
skip_callback :destroy, :after, :update_adjustable
result = yield
ensure
set_callback :save, :after, :update_adjustable
set_callback :destroy, :after, :update_adjustable
result
end
# Allow accessing soft-deleted originator objects
def originator
return if originator_type.blank?
originator_type.constantize.unscoped { super }
end
private
def update_adjustable
adjustable.update! if adjustable.is_a? Order
end
end
end

View File

@@ -20,6 +20,8 @@ class OrderFeesHandler
create_line_item_fees!
create_order_fees!
end
order.update!
end
def create_line_item_fees!

View File

@@ -78,7 +78,6 @@ describe Spree::Admin::OrdersController, type: :controller do
order.line_items.last.update(variant_id: variant2.id)
while !order.completed? do break unless order.next! end
order.recreate_all_fees!
order.update!
order
end

View File

@@ -313,7 +313,6 @@ describe Spree::OrdersController, type: :controller do
order.reload.line_items.last.update(variant_id: variant2.id)
while !order.completed? do break unless order.next! end
order.recreate_all_fees!
order.update!
order
end
let(:params) {

View File

@@ -63,18 +63,6 @@ module Spree
end
end
context "#save" do
it "should call order#update!" do
adjustment = Spree::Adjustment.new(
adjustable: order,
amount: 10,
label: "Foo"
)
expect(order).to receive(:update!)
adjustment.save
end
end
context "adjustment state" do
let(:adjustment) { create(:adjustment, state: 'open') }

View File

@@ -525,6 +525,7 @@ describe Spree::Order do
before do
allow(subject).to receive(:fee_handler) { fee_handler }
allow(subject).to receive(:update!)
end
it "clears all enterprise fee adjustments on the order" do