class AmazonPaApi::Operation

This is the parent class of every PA api Operations performed.

Constants

API_VERSION
END_POINTS

PA api end points.

PA api calls can be sent to any of 6 regions.

Attributes

body[R]

You can get PA api response via these.

header[R]

You can get PA api response via these.

operation[RW]

Subclass set this variables at initialize. String - The name of operation you want to perform.

region[RW]

Subclass set this variables at initialize. String - It will be use this to pick the right associates key up.

default is jp.

Public Class Methods

new() click to toggle source
# File lib/amazon_pa_api/operations/operation.rb, line 38
def initialize
  self.class.const_get("REQUEST_PARAMETERS").each do |param|
    self.class.send(:attr_accessor, param)
  end
end

Public Instance Methods

credentials=(access_key_id: '', secret_access_key: '', associate_tag:'' ) click to toggle source

You can set PA api credentials via this.

# File lib/amazon_pa_api/operations/operation.rb, line 50
def credentials=(access_key_id: '',
                 secret_access_key: '',
                 associate_tag:''
                )
  self.class.access_key_id = access_key_id
  self.class.secret_access_key = secret_access_key
  self.class.associate_tag = associate_tag
end
get() click to toggle source

Execute the request to Amazon.

# File lib/amazon_pa_api/operations/operation.rb, line 45
def get
  request
end

Protected Instance Methods

params() click to toggle source

It set instance variable from defined request parameters in subclass.

# File lib/amazon_pa_api/operations/operation.rb, line 62
def params
  self.class.const_get("REQUEST_PARAMETERS").inject({}) do |parameters, param|
    value = instance_variable_get("@#{param}")
    parameters[param.to_s.camel_case] = value unless value.nil?
    parameters
  end
end
request_params() click to toggle source

It set common query parameters as hash.

# File lib/amazon_pa_api/operations/operation.rb, line 71
def request_params
  parameters ={
    "Service"                    => "AWSECommerceService",
    "Timestamp"                  => Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ"),
    "AWSAccessKeyId"             => Operation.access_key_id.to_s,
    "AssociateTag"               => Operation.associate_tag.to_s,
    "Operation"                  => self.operation,
    "Version"                    => API_VERSION,
  }.merge!(params)
end
request_params_string() click to toggle source

It sort and set all query parameters as string.

# File lib/amazon_pa_api/operations/operation.rb, line 83
def request_params_string
  request_params.sort.inject('') do |params_string, (k,v)|
    params_string  += '&' unless params_string.size == 0
    params_string  += "#{k.to_s}=#{CGI.escape(v.to_s).gsub('+', '%20')}"
    params_string
  end
end

Private Instance Methods

add_signature(unsigned_uri) click to toggle source

it add signature parameter from uri

URI - To Amazon AWS ECommerce Service.
# File lib/amazon_pa_api/operations/operation.rb, line 95
def add_signature(unsigned_uri)
  signature = OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new("sha256"),
                                   Operation.secret_access_key.to_s,
                                   "GET\n#{unsigned_uri.host}\n#{unsigned_uri.path}\n#{unsigned_uri.query}"
                                  )
  signature = [signature].pack("m").chomp
  signature = URI.escape(signature, Regexp.new("[+=]"))
  URI.parse "#{unsigned_uri}&Signature=#{signature}"

end
request() click to toggle source

it add signature and requests Amazon via http.

# File lib/amazon_pa_api/operations/operation.rb, line 107
def request
  if self.class.access_key_id.nil? ||
     self.class.secret_access_key.nil? ||
     self.class.associate_tag.nil?
    raise "PA api requires AWS credentials. Please set access_key_id, secret_access_key and associate_tag, try again."
  end
  raise "Invalid region. region: #{self.region}" unless END_POINTS.include?(self.region)

  unsigned_uri = URI.parse("#{END_POINTS[self.region]}?#{request_params_string}")
  uri = add_signature(unsigned_uri)

  response = get_response uri
  @header = response.header
  @body = response.body

  response
end