class DearInventory::Response

Constants

API_LIMIT_ERROR

Attributes

request[R]
response[R]

Public Class Methods

new(request:, response:, num_previous_records: 0) click to toggle source
# File lib/dear_inventory/response.rb, line 23
def initialize(request:, response:, num_previous_records: 0)
  @request = T.let(request, DearInventory::Models::Request)
  @response = T.let(response, HTTP::Response)
  @num_previous_records = T.let(num_previous_records, Integer)

  @fields = T.let(nil, T.nilable(T::Array[Symbol]))
  @http_status = T.let(nil, T.nilable(Integer))
  @load_full_record = T.let(nil, T.nilable(T::Boolean))
  @num_records_paged = T.let(nil, T.nilable(Integer))
  @uri = T.let(nil, T.nilable(String))

  raise_error unless success?

  body_copy = T.cast(body, T.nilable(T::Hash[String, T.untyped]))
  @model = T.let(@request.model.new(body_copy), DearInventory::Model)
  assign_values
end

Public Instance Methods

each(&block) click to toggle source
# File lib/dear_inventory/response.rb, line 80
def each(&block)
  raise_not_paginated unless paginated?

  response = self
  loop do
    iterate_over_records(response, block)
    break unless response.next_page?

    response = response.next_page
  end
end
error() click to toggle source
# File lib/dear_inventory/response.rb, line 55
def error
  if body.respond_to?(:fetch)
    body_copy = T.cast(body, T::Hash[String, T.untyped])
    return body_copy.fetch("Exception", nil)
  end

  T.cast(body, T.nilable(String))
end
fields() click to toggle source
# File lib/dear_inventory/response.rb, line 44
def fields
  @fields ||= begin
    values = @request.model.const_get(:FIELDS).values.map do |field|
      field[:name]
    end
    values.unshift(:records) if @model.respond_to?(:records)
    values
  end
end
headers() click to toggle source
# File lib/dear_inventory/response.rb, line 65
def headers
  @response.headers
end
http_status() click to toggle source
# File lib/dear_inventory/response.rb, line 70
def http_status
  @http_status ||= @response.status.code
end
next_page() click to toggle source
# File lib/dear_inventory/response.rb, line 93
def next_page
  raise_not_paginated unless paginated?
  raise DearInventory::NoMorePagesError unless next_page?

  request = @request.dup
  T.unsafe(request.params).page = T.unsafe(@model).page + 1

  DearInventory::Request.(request, num_previous_records: num_records_paged)
end
next_page?() click to toggle source
# File lib/dear_inventory/response.rb, line 104
def next_page?
  raise_not_paginated unless paginated?

  num_records_paged < T.unsafe(self).total
end
num_records_paged() click to toggle source
# File lib/dear_inventory/response.rb, line 111
def num_records_paged
  @num_records_paged ||= begin
    raise_not_paginated unless paginated?

    @num_previous_records + T.unsafe(self).records.count
  end
end
paginated?() click to toggle source
# File lib/dear_inventory/response.rb, line 75
def paginated?
  @model.respond_to?(:page)
end
raise_not_paginated() click to toggle source
# File lib/dear_inventory/response.rb, line 120
def raise_not_paginated
  raise DearInventory::NotPaginatedError.new(uri: uri)
end
success?() click to toggle source
# File lib/dear_inventory/response.rb, line 125
def success?
  http_status == 200
end
uri() click to toggle source
# File lib/dear_inventory/response.rb, line 130
def uri
  @uri ||= @response.uri.to_s
end

Protected Instance Methods

body() click to toggle source
# File lib/dear_inventory/response.rb, line 137
def body
  string_body = @response.body.to_s
  parsed_body = JSON.parse(string_body)

  if parsed_body.is_a?(Array)
    parsed_body.first
  else
    parsed_body
  end
rescue JSON::ParserError
  string_body
end

Private Instance Methods

assign_values() click to toggle source
# File lib/dear_inventory/response.rb, line 153
def assign_values
  fields.each { |field| define_alias_method(field) }
end
define_alias_method(method_name) click to toggle source
# File lib/dear_inventory/response.rb, line 158
def define_alias_method(method_name)
  define_singleton_method(method_name) do
    @model.public_send(method_name)
  end
end
iterate_over_records(response, block) click to toggle source
# File lib/dear_inventory/response.rb, line 190
def iterate_over_records(response, block)
  return if T.unsafe(response).records.nil?

  T.unsafe(response).records.each do |record|
    record = record.full_record if load_full_record?
    block.call(record)
  end
end
load_full_record?() click to toggle source
# File lib/dear_inventory/response.rb, line 200
def load_full_record?
  @load_full_record ||=
    T.unsafe(self).records.first.respond_to?(:full_record)
end
raise_error() click to toggle source
# File lib/dear_inventory/response.rb, line 170
def raise_error
  if http_status == 400
    raise T.unsafe(DearInventory::BadRequestError).new(error, self)
  end

  if http_status == 503 && error == API_LIMIT_ERROR
    raise T.unsafe(DearInventory::APILimitError)
  end

  raise T.unsafe(DearInventory::Error).
    new("Unknown error (#{http_status}): #{error}")
end