module Cadence::Saga::Concern

Public Instance Methods

compensate?(error, compensate_on: [], do_not_compensate_on: []) click to toggle source
# File lib/cadence/saga/concern.rb, line 27
def compensate?(error, compensate_on: [], do_not_compensate_on: [])
  error_class = error.class
  if compensate_on.any?
    compensate_on.include?(error_class)
  else
    !do_not_compensate_on.include?(error_class)
  end
end
run_saga(configuration = {}, &block) click to toggle source
# File lib/cadence/saga/concern.rb, line 7
def run_saga(configuration = {}, &block)
  saga = Cadence::Saga::Saga.new(workflow)

  block.call(saga)

  Result.new(true)
rescue StandardError => error # TODO: is there a need for a specialized error here?
  logger.error("Saga execution aborted: #{error.inspect}")
  logger.debug(error.backtrace.join("\n"))

  if compensate?(error, **configuration)
    logger.error('Saga compensating')
    saga.compensate
    Result.new(false, error)
  else
    logger.error('Saga not compensating')
    raise error
  end
end