class BuckyBox::API
Constants
- ENDPOINTS
- NotFoundError
- ResponseError
Public Class Methods
fixtures_path()
click to toggle source
# File lib/buckybox/api.rb, line 47 def self.fixtures_path File.expand_path("../../../fixtures", __FILE__) end
new(headers)
click to toggle source
# File lib/buckybox/api.rb, line 51 def initialize(headers) @headers = headers.freeze @endpoint = ENDPOINTS.fetch(ENV.fetch("RAILS_ENV", :production).to_sym) end
Public Instance Methods
authenticate_customer(params = {}, options = {})
click to toggle source
# File lib/buckybox/api.rb, line 84 def authenticate_customer(params = {}, options = {}) query :post, "/customers/sign_in", params, options end
box(id, params = { embed: "extras,images,box_items" }, options = {})
click to toggle source
# File lib/buckybox/api.rb, line 60 def box(id, params = { embed: "extras,images,box_items" }, options = {}) query :get, "/boxes/#{id}", params, options, price: CrazyMoney end
boxes(params = { embed: "images" }, options = {})
click to toggle source
# File lib/buckybox/api.rb, line 56 def boxes(params = { embed: "images" }, options = {}) query :get, "/boxes", params, options, price: CrazyMoney end
create_or_update_customer(json_customer)
click to toggle source
# File lib/buckybox/api.rb, line 88 def create_or_update_customer(json_customer) customer = Oj.load(json_customer) if customer["id"] query :put, "/customers/#{customer['id']}", json_customer # TODO: replace by :patch else query :post, "/customers", json_customer end end
create_order(json_order)
click to toggle source
# File lib/buckybox/api.rb, line 98 def create_order(json_order) query :post, "/orders", json_order end
customer(id, params = {}, options = {})
click to toggle source
# File lib/buckybox/api.rb, line 80 def customer(id, params = {}, options = {}) query :get, "/customers/#{id}", params, options, account_balance: CrazyMoney end
customers(params = {}, options = {})
click to toggle source
# File lib/buckybox/api.rb, line 76 def customers(params = {}, options = {}) query :get, "/customers", params, options, account_balance: CrazyMoney end
delivery_service(id, params = {}, options = {})
click to toggle source
# File lib/buckybox/api.rb, line 68 def delivery_service(id, params = {}, options = {}) query :get, "/delivery_services/#{id}", params, options, fee: CrazyMoney end
delivery_services(params = {}, options = {})
click to toggle source
# File lib/buckybox/api.rb, line 64 def delivery_services(params = {}, options = {}) query :get, "/delivery_services", params, options, fee: CrazyMoney end
flush_cache!()
click to toggle source
# File lib/buckybox/api.rb, line 102 def flush_cache! @cache = nil end
webstore()
click to toggle source
# File lib/buckybox/api.rb, line 72 def webstore query :get, "/webstore" end
Private Instance Methods
add_types(object, types)
click to toggle source
# File lib/buckybox/api.rb, line 182 def add_types(object, types) if object.is_a?(Array) object.map { |item| add_types(item, types) } else types.each do |attribute, type| attribute = attribute.to_s new_value = type.new object.fetch(attribute) object.store(attribute, new_value) end object end end
exception_type(http_code)
click to toggle source
# File lib/buckybox/api.rb, line 125 def exception_type(http_code) { 404 => NotFoundError, }.fetch(http_code, ResponseError) end
handle_error!(response)
click to toggle source
# File lib/buckybox/api.rb, line 108 def handle_error!(response) parsed_response = parse_response(response) message = if parsed_response parsed_response["message"] || parsed_response else "Empty response" end message = "Error #{response.code} - #{message}" raise exception_type(response.code), message end
parse_response(response)
click to toggle source
# File lib/buckybox/api.rb, line 121 def parse_response(response) Oj.load(response.body) end
query(method, path, params = {}, options = {}, types = {})
click to toggle source
# File lib/buckybox/api.rb, line 131 def query(method, path, params = {}, options = {}, types = {}) options = { as_object: true }.merge(options) hash = query_cache(method, path, params, types) if options[:as_object] if hash.is_a?(Array) hash.map { |item| Response.new(item) } else Response.new(hash) end else hash end.freeze end
query_cache(method, path, params, types)
click to toggle source
# File lib/buckybox/api.rb, line 146 def query_cache(method, path, params, types) uri = [@endpoint, path].join query_fresh = lambda do params_key = (method == :get ? :params : :body) response = Typhoeus::Request.new( uri, headers: @headers, method: method, params_key => params, accept_encoding: "gzip", ).run handle_error!(response) unless response.success? parsed_response = parse_response(response) add_types(parsed_response, types) end if method == :get # NOTE: only cache GET method @cache ||= {} cache_key = [@headers.hash, uri, to_query(params)].join cached_response = @cache[cache_key] if cached_response && !cached_response.expired? cached_response.response else response = query_fresh.call @cache[cache_key] = CachedResponse.new(response) response end else query_fresh.call end end
to_query(hash)
click to toggle source
# File lib/buckybox/api.rb, line 197 def to_query(hash) if hash.empty? "" else hash.map do |key, value| "#{CGI.escape(key.to_s)}=#{CGI.escape(value)}" end.sort!.join("&") end end