From 70cdeef9ace8cd91ef546875aef67ac784d1f73e Mon Sep 17 00:00:00 2001 From: Dan Milne Date: Mon, 5 Feb 2024 23:16:37 +1100 Subject: [PATCH] Switch to using strings, rather than symbols for serach parameters --- lib/paapi.rb | 2 +- lib/paapi/client.rb | 82 ++++++++++++++++++++++++-------------------- lib/paapi/version.rb | 2 +- 3 files changed, 46 insertions(+), 40 deletions(-) diff --git a/lib/paapi.rb b/lib/paapi.rb index bee012d..e87eb4f 100644 --- a/lib/paapi.rb +++ b/lib/paapi.rb @@ -9,7 +9,7 @@ module Paapi class Error < StandardError; end class NotImplemented < StandardError; end - SEARCH_PARAMS = %i[Keywords Actor Artist Author Brand Title].freeze + SEARCH_PARAMS = %w[Keywords Actor Artist Author Brand Title].freeze DEFAULT_PARTNER_TYPE = "Associates" DEFAULT_MARKET = :us DEFAULT_CONDITION = "Any" diff --git a/lib/paapi/client.rb b/lib/paapi/client.rb index 96d952b..1e1bb2d 100644 --- a/lib/paapi/client.rb +++ b/lib/paapi/client.rb @@ -1,20 +1,21 @@ -require 'net/http/persistent' -require 'aws-sigv4' +require "net/http/persistent" +require "aws-sigv4" module Paapi class Client attr_accessor :partner_tag, :marketplace, :resources, :condition attr_reader :partner_type, :access_key, :secret_key, :market, :http - def initialize(access_key: Paapi.access_key, - secret_key: Paapi.secret_key, - partner_tag: Paapi.partner_tag, - market: Paapi.market || DEFAULT_MARKET, - condition: Paapi.condition || DEFAULT_CONDITION, - resources: Paapi.resources || DEFAULT_RESOURCES, - partner_type: DEFAULT_PARTNER_TYPE - ) - raise ArgumentError unless MARKETPLACES.keys.include?(market.to_sym) + def initialize( + access_key: Paapi.access_key, + secret_key: Paapi.secret_key, + partner_tag: Paapi.partner_tag, + market: Paapi.market || DEFAULT_MARKET, + condition: Paapi.condition || DEFAULT_CONDITION, + resources: Paapi.resources || DEFAULT_RESOURCES, + partner_type: DEFAULT_PARTNER_TYPE + ) + raise ArgumentError unless MARKETPLACES.key?(market.to_sym) @access_key = access_key @secret_key = secret_key @@ -24,7 +25,11 @@ module Paapi self.market = market @partner_tag = partner_tag if !partner_tag.nil? - @http = Net::HTTP::Persistent.new name: 'paapi' + @http = Net::HTTP::Persistent.new(name: "paapi").tap do |c| + c.open_timeout = 2 + c.read_timeout = 5 + c.write_timeout = 5 + end end def market=(a_market) @@ -36,53 +41,54 @@ module Paapi end def get_items(item_ids:, **options) - payload = { PartnerTag: partner_tag, PartnerType: 'Associates', ItemIds: Array(item_ids), Resources: @resources }.merge(options) + payload = {PartnerTag: partner_tag, PartnerType: "Associates", ItemIds: Array(item_ids), Resources: @resources}.merge(options) request(op: :get_items, payload: payload) end - def get_variations(asin:, **options ) - payload = { ASIN: asin, Resources: @resources }.merge(options) + def get_variations(asin:, **options) + payload = {ASIN: asin, Resources: @resources}.merge(options) request(op: :get_variations, payload: payload) end # TODO: Currently we assume Keywords, but we need one of the following: [Keywords Actor Artist Author Brand Title ] - def search_items(**options ) + def search_items(**options) + options.transform_keys!(&:to_s) raise ArgumentError.new("Missing keywords") unless (options.keys & SEARCH_PARAMS).length.positive? - search_index = options.dig(:SearchIndex) ||'All' + search_index = options.dig(:SearchIndex) || "All" - payload = { PartnerTag: partner_tag, PartnerType: 'Associates', Resources: @resources, ItemCount: 10, ItemPage: 1, SearchIndex: search_index }.merge(options) + payload = {"PartnerTag" => partner_tag, "PartnerType" => "Associates", "Resources" => @resources, "ItemCount" => 10, "ItemPage" => 1, "SearchIndex" => search_index}.merge(options) request(op: :search_items, payload: payload) end def get_browse_nodes(browse_node_ids:, **options) - payload = { BrowseNodeIds: Array(browse_node_ids), Resources: @resources }.merge(options) + payload = {BrowseNodeIds: Array(browse_node_ids), Resources: @resources}.merge(options) request(op: :get_browse_nodes, payload: payload) end - + private - - def request(op:, payload:) - raise ArguemntError unless Paapi::OPERATIONS.keys.include?(op) - + + def request(op:, payload:) + raise ArguemntError unless Paapi::OPERATIONS.key?(op) + operation = OPERATIONS[op] headers = { - 'X-Amz-Target' => "com.amazon.paapi5.v1.ProductAdvertisingAPIv1.#{operation.target_name}", - 'Content-Encoding' => 'amz-1.0', + "X-Amz-Target" => "com.amazon.paapi5.v1.ProductAdvertisingAPIv1.#{operation.target_name}", + "Content-Encoding" => "amz-1.0" } default_payload = { - 'Condition' => condition, - 'PartnerTag' => partner_tag, - 'PartnerType' => partner_type, - 'Marketplace' => marketplace.site + "Condition" => condition, + "PartnerTag" => partner_tag, + "PartnerType" => partner_type, + "Marketplace" => marketplace.site } payload = default_payload.merge(payload) - endpoint = "https://#{marketplace.host}/paapi5/#{operation.endpoint_suffix}" + endpoint = "https://#{marketplace.host}/paapi5/#{operation.endpoint_suffix}" signer = Aws::Sigv4::Signer.new( service: operation.service, @@ -95,20 +101,20 @@ module Paapi signature = signer.sign_request(http_method: operation.http_method, url: endpoint, headers: headers, body: payload.to_json) - headers['Host'] = marketplace.host - headers['X-Amz-Date'] = signature.headers['x-amz-date'] - headers['X-Amz-Content-Sha256']= signature.headers['x-amz-content-sha256'] - headers['Authorization'] = signature.headers['authorization'] - headers['Content-Type'] = 'application/json; charset=utf-8' + headers["Host"] = marketplace.host + headers["X-Amz-Date"] = signature.headers["x-amz-date"] + headers["X-Amz-Content-Sha256"] = signature.headers["x-amz-content-sha256"] + headers["Authorization"] = signature.headers["authorization"] + headers["Content-Type"] = "application/json; charset=utf-8" - Response.new( post(url: endpoint, body: payload, headers: headers)) + Response.new(post(url: endpoint, body: payload, headers: headers)) end def post(url:, body:, headers:) uri = URI.parse(url) post_request = Net::HTTP::Post.new(uri.path) - post_request.content_type = 'application/json; charset=UTF-8' + post_request.content_type = "application/json; charset=UTF-8" headers.each { |k, v| post_request[k] = v } post_request.body = body.to_json diff --git a/lib/paapi/version.rb b/lib/paapi/version.rb index e542b3c..366834c 100644 --- a/lib/paapi/version.rb +++ b/lib/paapi/version.rb @@ -1,3 +1,3 @@ module Paapi - VERSION = '0.1.9' + VERSION = '0.1.10' end