Module: SpreeCmCommissioner::OrderSeatable

Extended by:
ActiveSupport::Concern
Defined in:
app/models/concerns/spree_cm_commissioner/order_seatable.rb

Instance Method Summary collapse

Instance Method Details

#cancel_blocks!Object



43
44
45
46
47
48
49
50
# File 'app/models/concerns/spree_cm_commissioner/order_seatable.rb', line 43

def cancel_blocks!
  return unless should_manage_blocks?

  CmAppLogger.log(label: "#{self.class.name}#cancel_blocks!", data: { order_id: id }) do
    SpreeCmCommissioner::Seats::BlocksCanceler.new(order_id: id, cancel_by: user).cancel_blocks!
    update!(hold_expires_at: nil)
  end
end

#ensure_blocks_held!Object

Makes sure seat blocks are held if not held yet or if the hold has expired. Called before moving to payment state to ensure seats are held properly, even if hold was started from :address state or an old hold expired.



20
21
22
23
24
25
# File 'app/models/concerns/spree_cm_commissioner/order_seatable.rb', line 20

def ensure_blocks_held!
  return unless should_manage_blocks?
  return if hold_expires_at.present? && hold_expires_at > Time.zone.now

  hold_blocks!
end

#hold_blocks!Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'app/models/concerns/spree_cm_commissioner/order_seatable.rb', line 27

def hold_blocks!
  return unless should_manage_blocks?

  CmAppLogger.log(label: "#{self.class.name}#hold_blocks!", data: { order_id: id }) do
    held_blocks = SpreeCmCommissioner::Seats::BlocksHolder.new(
      line_item_ids: line_item_ids,
      hold_by: user
    ).hold_blocks!

    if held_blocks.any?
      min_expiration = held_blocks.map(&:expired_at).min
      update!(hold_expires_at: min_expiration)
    end
  end
end

#preload_block_idsObject



69
70
71
# File 'app/models/concerns/spree_cm_commissioner/order_seatable.rb', line 69

def preload_block_ids
  self.&.fetch('preload_block_ids', []) || []
end

#preload_block_ids=(preload_block_ids = []) ⇒ Object

Calling ‘.block_ids` directly can cause many slow database queries (N+1 problem) every time `.should_manage_blocks?` or `.preload_block_ids` runs. To avoid this, we store a precomputed list of block IDs in `private_metadata`. This list is updated whenever a guest’s block is saved or destroy.



64
65
66
67
# File 'app/models/concerns/spree_cm_commissioner/order_seatable.rb', line 64

def preload_block_ids=(preload_block_ids = [])
  self. ||= {}
  self.['preload_block_ids'] = preload_block_ids
end

#reserve_blocks!Object



52
53
54
55
56
57
58
# File 'app/models/concerns/spree_cm_commissioner/order_seatable.rb', line 52

def reserve_blocks!
  return unless should_manage_blocks?

  CmAppLogger.log(label: "#{self.class.name}#reserve_blocks!", data: { order_id: id }) do
    SpreeCmCommissioner::Seats::BlocksReserver.new(line_item_ids: line_item_ids, reserve_by: user).reserve_blocks!
  end
end

#should_manage_blocks?Boolean

Returns:

  • (Boolean)


13
14
15
# File 'app/models/concerns/spree_cm_commissioner/order_seatable.rb', line 13

def should_manage_blocks?
  preload_block_ids.any?
end