class IdempotentRequest::RequestManager

Attributes

request[R]
storage[R]

Public Class Methods

new(request, config) click to toggle source
# File lib/idempotent-request/request_manager.rb, line 5
def initialize(request, config)
  @request = request
  @storage = config.fetch(:storage)
  @callback = config[:callback]
end

Public Instance Methods

lock() click to toggle source
# File lib/idempotent-request/request_manager.rb, line 11
def lock
  storage.lock(key)
end
read() click to toggle source
# File lib/idempotent-request/request_manager.rb, line 19
def read
  status, headers, response = parse_data(storage.read(key)).values

  return unless status
  run_callback(:detected, key: request.key)
  [status, headers, response]
end
unlock() click to toggle source
# File lib/idempotent-request/request_manager.rb, line 15
def unlock
  storage.unlock(key)
end
write(*data) click to toggle source
# File lib/idempotent-request/request_manager.rb, line 27
def write(*data)
  status, headers, response = data
  response = response.body if response.respond_to?(:body)

  if (200..226).cover?(status)
    storage.write(key, payload(status, headers, response))
  end

  data
end

Private Instance Methods

key() click to toggle source
# File lib/idempotent-request/request_manager.rb, line 58
def key
  request.key
end
parse_data(data) click to toggle source
# File lib/idempotent-request/request_manager.rb, line 40
def parse_data(data)
  return {} if data.to_s.empty?

  Oj.load(data)
end
payload(status, headers, response) click to toggle source
# File lib/idempotent-request/request_manager.rb, line 46
def payload(status, headers, response)
  Oj.dump(status: status,
          headers: headers.to_h,
          response: Array(response))
end
run_callback(action, **args) click to toggle source
# File lib/idempotent-request/request_manager.rb, line 52
def run_callback(action, **args)
  return unless @callback

  @callback.new(request).send(action, **args)
end