Class: Coupon::ApplyCoupon

Inherits:
Object
  • Object
show all
Defined in:
app/services/coupon/apply_coupon.rb

Defined Under Namespace

Classes: Result

Instance Method Summary collapse

Instance Method Details

#perform(itemizable, discount_params) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'app/services/coupon/apply_coupon.rb', line 7

def perform(itemizable, discount_params)
  lock_key = "#{itemizable.class.name.downcase}_#{itemizable.id}".freeze
  errors = []
  itemizable.with_advisory_lock(lock_key, timeout_seconds: 120) do
    dc = itemizable.discounts.build(discount_params)
    dc.effective_date = Date.current # Timestamp time of use
    if dc.save
      # Set flag to trigger discount recalculation for the newly added coupon
      itemizable.update_column(:recalculate_discounts, true)
      itemizable.reload.reset_discount
    end
    errors = itemizable.errors.full_messages + dc.errors.full_messages
  end

  Result.new(success: errors.blank?, errors: errors)
end