Class: SpreeCmCommissioner::Guests::Create

Inherits:
Object
  • Object
show all
Includes:
Spree::ServiceModule::Base
Defined in:
app/services/spree_cm_commissioner/guests/create.rb

Instance Method Summary collapse

Instance Method Details

#call(line_item:, guest_params: {}) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'app/services/spree_cm_commissioner/guests/create.rb', line 13

def call(line_item:, guest_params: {})
  guest = line_item.guests.new(guest_params)

  # Release holds BEFORE mutating, using the quantities the hold was placed against
  # (Release reads live line items). Only release when this guest will actually bump
  # the quantity. Guard on success and abort if it fails.
  if will_change_quantity?(line_item)
    release = line_item.order.release_order_holds(reason: :cart_changed)
    return release unless release.success?
  end

  line_item.with_lock do
    next unless guest.save

    bump_quantity_to_cover_guests(line_item) if need_to_bump_quantity?(line_item)
  end

  return failure(guest) unless guest.persisted?

  success(guest: guest)
rescue StandardError => e
  CmAppLogger.error(
    label: 'SpreeCmCommissioner::Guests::Create#call',
    data: {
      error_class: e.class.name,
      error_message: e.message
    }
  )
  failure(guest)
end