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