Class: SpreeCmCommissioner::WaitingRoom::BypassEligibility

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

Constant Summary collapse

STUCK_STATES =

States vpago only clears via the admin reprocess action — genuinely stuck on our side. Excludes failed (clean decline): the user's own abandonment, not something we broke.

%w[processing void invalid checkout].freeze

Instance Method Summary collapse

Instance Method Details

#call(jwt:, order_token:, user: nil) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'app/services/spree_cm_commissioner/waiting_room/bypass_eligibility.rb', line 23

def call(jwt:, order_token:, user: nil)
  return failure(:missing_order_token) if order_token.blank?

  payload = verified_payload(jwt, order_token)
  return failure(:invalid_bypass_jwt) if payload.nil?

  payment = Spree::Payment.find_by(number: payload['payment_number'])
  return failure(:invalid_bypass_jwt) if payment.nil?
  return failure(:order_token_mismatch) unless payment.order&.token == order_token
  return failure(:order_not_owned_by_user) unless owned_by_caller?(payment.order, user)
  return failure(:payment_not_stuck) unless STUCK_STATES.include?(payment.state)
  return failure(:order_already_paid) if payment.order.payment_state == 'paid'

  success(payment_number: payment.number, source: payload['source'])
# Backstop: a best-effort bypass must never 500 session-create over a bad token.
rescue StandardError => e
  Rails.logger.warn("[WaitingRoom] bypass verification failed: #{e.class}: #{e.message}")
  failure(:invalid_bypass_jwt)
end