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