class OneMoreTime::IdempotentRequest

Public Instance Methods

execute() { || ... } click to toggle source
# File lib/one_more_time/idempotent_request.rb, line 13
def execute
  # No-op the request if we already have a saved response.
  return if finished?

  begin
    yield if block_given?
  rescue PermanentError
    # Something has called .failure!, so we assume there is now a saved response
    # and can just no-op
  rescue StandardError
    update_and_unlock
    raise
  end
  # TODO: raise unless finished?
end
failure!(exception: nil, response_code: nil, response_body: nil) click to toggle source
# File lib/one_more_time/idempotent_request.rb, line 39
def failure!(exception: nil, response_code: nil, response_body: nil)
  attrs = (exception.present? && @failure_attributes_block&.call(exception)) || {}
  attrs.merge!({response_code: response_code, response_body: response_body}.compact)
  update_and_unlock(attrs)
  raise PermanentError
end
failure_attributes(&block) click to toggle source
# File lib/one_more_time/idempotent_request.rb, line 9
def failure_attributes(&block)
  @failure_attributes_block = block
end
finished?() click to toggle source
# File lib/one_more_time/idempotent_request.rb, line 46
def finished?
  response_code.present? || response_body.present?
end
success() { || ... } click to toggle source
# File lib/one_more_time/idempotent_request.rb, line 29
def success
  ActiveRecord::Base.transaction do
    result = yield if block_given?
    attrs = @success_attributes_block&.call(result) || {}
    update_and_unlock(attrs)
  end
rescue StandardError => exception
  failure!(exception: exception)
end
success_attributes(&block) click to toggle source
# File lib/one_more_time/idempotent_request.rb, line 5
def success_attributes(&block)
  @success_attributes_block = block
end

Private Instance Methods

update_and_unlock(attrs={}) click to toggle source
# File lib/one_more_time/idempotent_request.rb, line 54
def update_and_unlock(attrs={})
  update!({ locked_at: nil }.merge(attrs.slice(:response_code, :response_body)))
end