class Jahuty::Response::Handler

Inspects the response and returns the appropriate resource or collection.

Public Instance Methods

call(action, response) click to toggle source
# File lib/jahuty/response/handler.rb, line 9
def call(action, response)
  resource_name = name_resource action, response

  payload = parse response

  @resources ||= ::Jahuty::Resource::Factory.new

  if collection?(payload)
    payload.map { |data| @resources.call resource_name, data }
  elsif resource?(payload)
    @resources.call resource_name, payload
  else
    raise ArgumentError, 'Action and payload mismatch'
  end
end

Private Instance Methods

collection?(payload) click to toggle source
# File lib/jahuty/response/handler.rb, line 27
def collection?(payload)
  payload.is_a?(::Array)
end
name_resource(action, response) click to toggle source
# File lib/jahuty/response/handler.rb, line 31
def name_resource(action, response)
  if success? response
    action.resource
  elsif problem? response
    'problem'
  else
    raise ArgumentError, 'Unexpected response'
  end
end
parse(response) click to toggle source
# File lib/jahuty/response/handler.rb, line 41
def parse(response)
  JSON.parse(response.body, symbolize_names: true)
end
problem?(response) click to toggle source
# File lib/jahuty/response/handler.rb, line 45
def problem?(response)
  response.headers['Content-Type'].include?('application/problem+json') &&
    (response.status < 200 || response.status >= 300)
end
resource?(payload) click to toggle source
# File lib/jahuty/response/handler.rb, line 50
def resource?(payload)
  payload.is_a?(::Object)
end
success?(response) click to toggle source
# File lib/jahuty/response/handler.rb, line 54
def success?(response)
  response.headers['Content-Type'].include?('application/json') &&
    response.status.between?(200, 299)
end