Skip to content

Instantly share code, notes, and snippets.

@yulgolem
Created October 18, 2018 13:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yulgolem/de66def7df1852cdee73d67e4a3ecd56 to your computer and use it in GitHub Desktop.
Save yulgolem/de66def7df1852cdee73d67e4a3ecd56 to your computer and use it in GitHub Desktop.
class BaseInteraction
attr_accessor :result, :artifacts, :fail_policy
def initialize(params = {})
params.each do |attr, value|
self.public_send("#{attr}=", value)
end if params
self.result = nil
self.artifacts = {}
self.fail_policy ||= :unexpected
prepare
super()
end
def self.execute(params = {})
Rails.logger.info "#{Time.current.iso8601}: Executing interaction #{name}"
interaction = new(params)
interaction.result = interaction.run
interaction
end
def self.execute_async(params = {})
delay = params.delete :delay
at = params.delete :at
if delay
Rails.logger.info "#{Time.current.iso8601}: Enqueue async execute with delay #{delay} #{name}, #{params.to_json}"
InteractionWorker.perform_in delay, name, { fail_policy: :exception }.merge(params)
elsif at
Rails.logger.info "#{Time.current.iso8601}: Enqueue scheduled async execute at #{at} #{name}, #{params.to_json}"
InteractionWorker.perform_at at, name, { fail_policy: :exception }.merge(params)
else
Rails.logger.info "#{Time.current.iso8601}: Enqueue async execute #{name}, #{params.to_json}"
InteractionWorker.perform_async name, { fail_policy: :exception }.merge(params)
end
end
private
def fail!(message)
case fail_policy.to_sym
when :exception
raise message
when :silent
Rollbar.error(message) if defined?(Rollbar)
nil
when :unexpected
raise "Unexpected fail policy, error - #{message}"
else
raise "Unexpected fail policy #{fail_policy}, error - #{message}"
end
end
def prepare; end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment