Module: SpreeCmCommissioner::OrderSeatable
- Extended by:
- ActiveSupport::Concern
- Defined in:
- app/models/concerns/spree_cm_commissioner/order_seatable.rb
Instance Method Summary collapse
- #cancel_blocks! ⇒ Object
-
#ensure_blocks_held! ⇒ Object
Makes sure seat blocks are held if not held yet or if the hold has expired.
- #hold_blocks! ⇒ Object
- #preload_block_ids ⇒ Object
-
#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.
- #reserve_blocks! ⇒ Object
- #should_manage_blocks? ⇒ Boolean
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_ids ⇒ Object
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
13 14 15 |
# File 'app/models/concerns/spree_cm_commissioner/order_seatable.rb', line 13 def should_manage_blocks? preload_block_ids.any? end |