Class: SpreeCmCommissioner::Seats::UnlockBlocks

Inherits:
Object
  • Object
show all
Extended by:
SpreeCmCommissioner::ServiceModuleThrowable
Includes:
Spree::ServiceModule::Base, BlockDateIteration
Defined in:
app/services/spree_cm_commissioner/seats/unlock_blocks.rb

Overview

Returns operator-locked seats to sale — the inverse of LockBlocks.

Deletes the locked row and gives the seat back to quantity_available. Rows that are no longer locked — a customer's booking, or a lock already released — are skipped and never resurrected, so a stale unlock request cannot destroy a real reservation.

success(applied: [ReservedBlock, ...], skipped: [{ date:, block_label:, reason: }, ...])

Instance Method Summary collapse

Methods included from SpreeCmCommissioner::ServiceModuleThrowable

call!

Instance Method Details

#call(block_ids:, dates:, actor: nil) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'app/services/spree_cm_commissioner/seats/unlock_blocks.rb', line 15

def call(block_ids:, dates:, actor: nil)
  blocks = lockable_blocks(block_ids)
  return failure(nil, :no_blocks_given) if blocks.empty?

  applied = []
  skipped = []

  each_block_date(blocks, dates, skipped) do |block, date, item|
    outcome = nil
    item.with_lock { outcome = release(item, block, actor, applied) }

    skipped << skip(date, block, outcome) if outcome == :not_locked
  end

  log_outcome(block_ids, dates, applied, skipped)

  success(applied: applied, skipped: skipped)
rescue StandardError => e
  # Same convention as ReservedBlocks::Hold/Reserve/Cancel — see LockBlocks for why this matters.
  error = { error_type: e.class.name.demodulize, message: e.message }
  CmAppLogger.error(label: "#{self.class.name}#call failed", data: error)
  failure(nil, e.message)
end