Skip to content

Instantly share code, notes, and snippets.

@tejo
Created May 4, 2012 08:04
Show Gist options
  • Save tejo/2593177 to your computer and use it in GitHub Desktop.
Save tejo/2593177 to your computer and use it in GitHub Desktop.
require 'json'
require 'typhoeus'
require 'logger'
module Yoox
class Config
class << self
attr_accessor :host, :logger, :api_key
end
def self.log(request, msg=nil)
response = request.response
logger.info("#{Time.now.strftime('%Y-%d-%m-%H:%M')} #{response.code} #{response.request.url} in #{response.time} seconds #{msg}")
end
end
Config.logger = Logger.new('log/yoox.log')
Config.host = "http://api.yoox.biz"
Config.api_key = 'website-zegna.com/1.1'
class Client
attr_accessor :user_geo_data
attr_accessor :success
attr_accessor :cart_id
attr_accessor :cart_token
def initialize(ip, skip_geocode = false)
@success = true
res = Request.fetch(user_geo_data_url(ip), 'Site') unless skip_geocode
@user_geo_data = res
@success = false if res.nil?
end
def self.get_instance(user_geo_data)
instance = new(nil,true)
instance.user_geo_data = user_geo_data
instance.success = true
return instance
end
def new_cart
cart = Request.fetch(cart_url, 'CartSession', {:method => :post})
@cart_id , @cart_token = cart['CartId'], cart['CartToken']
cart
end
# permette di leggere il contenuto del carrello passando cart_id e cart_token
def get_cart(cart_id = nil, cart_token = nil)
@cart_id ||= cart_id
@cart_token ||= cart_token
Request.fetch(cart_url(@cart_id), 'Cart',
{:method => :get},
{'x-yoox-cart-token' => @cart_token}) rescue nil
end
def get_item(code8)
Request.fetch(item_url(code8), "Item")
end
def add_cart_item(code10, size)
res = Request.fetch(cart_items_url, false,
{:method => :post},
{'x-yoox-cart-token' => @cart_token},
{"Code10" => code10, "Size" => size }.to_json)
handle_response(res)
end
def remove_cart_item(code10, size)
res = Request.fetch(remove_cart_item_url(code10, size), false, {:method => :delete}, {'x-yoox-cart-token' => @cart_token})
handle_response(res)
end
def site_code
@user_geo_data['SiteCode']
end
def self.countries
Request.fetch("#{Config.host}/Geo.API/1.0/country/ZEGNA.json",'Countries')
end
def user_geo_data_url(ip)
"#{Config.host}/Geo.API/1.0/site/ZEGNA/#{ip}.json"
end
def item_url(code8)
"#{Config.host}/Item.API/1.0/#{site_code}/item/#{code8}.json"
end
def cart_url(cart_id = nil)
"#{Config.host}/Cart.API/1.5/#{site_code}/carts#{"/#{cart_id}" if cart_id}.json"
end
def cart_items_url
"#{Config.host}/Cart.API/1.5/#{site_code}/carts/#{cart_id}/items.json"
end
def remove_cart_item_url(code10, size)
"#{Config.host}/Cart.API/1.5/#{site_code}/carts/#{cart_id}/items/#{code10}/#{size}.json"
end
def handle_response(res)
if res.is_a? Hash
return true
else
return false
end
end
end
class Request
attr_accessor :response
def self.fetch(uri, response_hash_key = false, options = {}, headers = {}, body = nil)
options = {:method => :get, :params => {}}.merge(options)
headers = {'Content-Type' => "application/json; charset=utf-8", "Accept" => "application/json", 'x-yoox-appname' => Config.api_key }.merge(headers)
#p '------', uri, body, headers, options, '----'
request = Typhoeus::Request.new(uri,
:body => body,
:method => options[:method],
:headers => headers,
:timeout => 30*1000, # milliseconds
:cache_timeout => 60, # seconds
:params => options[:params])
hydra = Typhoeus::Hydra.new(:max_concurrency => 20)
hydra.queue(request)
hydra.run
#handling request
if is_valid_response(request) and is_valid_yoox_response(request)
#se è specificata una chiave relativa ai dati che torna yoox allora ritorna solo quell'elemento, altrimneti torna tutto l'hash
return (response_hash_key ? @response[response_hash_key] : @response)
else
return nil
end
end
def self.is_valid_yoox_response(request)
@response = JSON.parse(request.response.body)
@response['Header']['StatusCode'] == 200 or @response['Header']['StatusCode'] == 201
end
def self.is_valid_response(request)
case
when request.response.success?
#Config.log(request)
return true
when request.response.timed_out?
Config.log(request, "time out error")
return false
when request.response.code == 0
# Could not get an http response, something's wrong.
Config.log(request, request.response.curl_error_message)
return false
else
# Received a non-successful http response.
Config.log(request, "HTTP request failed: " + request.response.code.to_s)
return false
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment