lib/printfection/api.rb
module Printfection
module API
ENDPOINT = "api.printfection.com/v2/"
attr_accessor :api_token, :debug_mode
def get(uri="/", params={})
request :get, uri, params
end
def post(uri, data={})
request :post, uri, data
end
def patch(uri, data={})
request :patch, uri, data
end
def delete(uri)
request :delete, uri
end
def request(verb, uri, params={})
perform_request do
uri = Util.join_uri(ENDPOINT, uri)
url = "https://#{api_token}:@#{uri}"
response = case verb
when :get; RestClient.get url, :params => params, :accept => :json
when :post; RestClient.post url, params.to_json, :accept => :json, :content_type => :json
when :patch; RestClient.patch url, params.to_json, :accept => :json, :content_type => :json
when :delete; RestClient.delete url
end
json = JSON.parse(response.body)
if json["object"] == "list" and json.has_key? "data"
json["data"]
else
json
end
end
end
private
def perform_request(&block)
return yield if debug_mode
begin
yield
# At this point, some exception has been raised either
# during the request or parsing the response.
#
# We determine the type of error, and re-raise
# our own error from the message in the response body.
rescue RestClient::Exception => e
# We likely got a 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.
# Handle 400, 401, and 404 errors.
# 400 Bad Request - Invalid or missing request parameters.
# 401 Unauthorized - Invalid API key provided.
# 404 Not Found - The requested item doesn't exist or the client doesn't own it.
if [400, 401, 404].include?(e.http_code)
raise Error, JSON.parse(e.http_body)["message"]
end
# Handle any other http error (i.e. 5xx+), or other RestClient exceptions.
# Re-raise a generic error.
raise Error, "Something went wrong with the request. Please try again."
rescue JSON::ParserError => e
# We received the data fine, but we're unable to parse it.
# Re-raise a generic error.
raise Error, "Something went wrong parsing the response. Please try again."
rescue StandardError => e
# Something else went wrong.
# Re-raise a generic error.
raise Error, "Something went wrong. Please try again."
end
end
end
end