Created
May 4, 2012 08:04
-
-
Save tejo/2593177 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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