module PrintReleaf::API

Constants

API_EXCEPTIONS
ENDPOINT
MAX_RETRY_COUNT
NETWORK_EXCEPTIONS
PROTOCOL
RETRY_DELAY_BASE
USER_AGENT

Attributes

api_key[W]
endpoint[W]
logger[RW]
protocol[W]
user_agent[W]

Public Instance Methods

api_key() click to toggle source
# File lib/printreleaf/api.rb, line 34
def api_key
  if @api_key.nil? or @api_key.strip.to_s.empty?
    raise Error, "Missing API Key."
  else
    return @api_key
  end
end
delete(uri) click to toggle source
# File lib/printreleaf/api.rb, line 66
def delete(uri)
  request :delete, uri
end
endpoint() click to toggle source
# File lib/printreleaf/api.rb, line 42
def endpoint
  @endpoint || ENDPOINT
end
get(uri="/", params={}) click to toggle source
# File lib/printreleaf/api.rb, line 54
def get(uri="/", params={})
  request :get, uri, params
end
patch(uri, data={}) click to toggle source
# File lib/printreleaf/api.rb, line 62
def patch(uri, data={})
  request :patch, uri, data
end
post(uri, data={}) click to toggle source
# File lib/printreleaf/api.rb, line 58
def post(uri, data={})
  request :post, uri, data
end
protocol() click to toggle source
# File lib/printreleaf/api.rb, line 46
def protocol
  @protocol || PROTOCOL
end
request(verb, uri, params={}) click to toggle source
# File lib/printreleaf/api.rb, line 70
def request(verb, uri, params={})
  perform_request do
    uri = Util.join_uri(endpoint, uri)
    url = "#{protocol}://#{uri}"

    request_params = {
      method: verb,
      url: url,
      headers: {
        accept: :json,
        :Authorization => "Bearer #{api_key}",
        :user_agent => user_agent
      }
    }

    if verb == :get || verb == :delete
      request_params[:headers][:params] = params unless params.empty?
    else
      request_params[:payload] = params.to_json
      request_params[:headers][:content_type] = :json
    end

    unless logger.nil?
      logger.info "[PrintReleaf] #{verb.upcase} #{uri}"
    end

    response = RestClient::Request.execute(request_params)

    JSON.parse(response.body)
  end
end
user_agent() click to toggle source
# File lib/printreleaf/api.rb, line 50
def user_agent
  @user_agent || USER_AGENT
end

Private Instance Methods

handle_api_error(e, retry_count=0) click to toggle source
# File lib/printreleaf/api.rb, line 136
def handle_api_error(e, retry_count=0)
  # We likely got an http status code outside the 200-399 range.
  # If this is a GET or DELETE request, it is likely the resource is not owned by the client.
  # If this is a POST, PUT, or PATCH, the data might be invalid.
  code = e.response.code
  message = e.response ? JSON.parse(e.response.body)["error"] : "Something went wrong. Please try again."
  message += " (code=#{code})"
  message += " Request was retried #{retry_count} times." if retry_count > 0
  exception = API_EXCEPTIONS[e.response.code] || Error
  raise exception, message
end
handle_error(e, retry_count) click to toggle source
# File lib/printreleaf/api.rb, line 119
def handle_error(e, retry_count)
  case e
  when RestClient::ExceptionWithResponse
    if e.response
      handle_api_error(e, retry_count)
    else
      handle_restclient_error(e, retry_count)
    end
  when JSON::ParserError
    handle_json_error(e, retry_count)
  when *NETWORK_EXCEPTIONS
    handle_network_error(e, retry_count)
  else
    raise
  end
end
handle_json_error(e, retry_count=0) click to toggle source
# File lib/printreleaf/api.rb, line 148
def handle_json_error(e, retry_count=0)
  # We received the data fine, but we're unable to parse it.
  # Re-raise a generic error.
  message = "Unable to parse response. Please try again."
  message += " Request was retried #{retry_count} times." if retry_count > 0
  message += " (#{e.class.name})"
  raise ResponseError, message
end
handle_network_error(e, retry_count=0) click to toggle source
# File lib/printreleaf/api.rb, line 157
def handle_network_error(e, retry_count=0)
  message = "Unexpected error communicating when trying to connect to PrintReleaf."
  message += " Request was retried #{retry_count} times." if retry_count > 0
  message += " (#{e.class.name})"
  raise NetworkError, message
end
handle_restclient_error(e, retry_count=0) click to toggle source
# File lib/printreleaf/api.rb, line 164
def handle_restclient_error(e, retry_count=0)
  message = "Something went wrong with the request. Please try again."
  message += " Request was retried #{retry_count} times." if retry_count > 0
  message += " (#{e.class.name})"
  raise RequestError, message
end
perform_request() { || ... } click to toggle source
# File lib/printreleaf/api.rb, line 104
def perform_request
  retry_count = 0
  begin
    yield
  rescue => e
    if should_retry?(e, retry_count)
      retry_count += 1
      sleep retry_delay(retry_count)
      retry
    else
      handle_error(e, retry_count)
    end
  end
end
retry_delay(retry_count=0) click to toggle source
# File lib/printreleaf/api.rb, line 175
def retry_delay(retry_count=0)
  RETRY_DELAY_BASE ** retry_count
end
should_retry?(e, retry_count=0) click to toggle source
# File lib/printreleaf/api.rb, line 171
def should_retry?(e, retry_count=0)
  NETWORK_EXCEPTIONS.include?(e.class) && retry_count < MAX_RETRY_COUNT
end