class Bluekai::Request

Attributes

api_private_key[RW]
api_user_key[RW]
body[R]
domain[R]
method[R]
path[R]
query[R]

Public Class Methods

new(method, path, query, body, domain) click to toggle source
# File lib/bluekai/request.rb, line 8
def initialize(method, path, query, body, domain)
  @method = method.upcase
  @path = path
  @query = query
  @body = body
  @domain = domain
end

Public Instance Methods

run() click to toggle source
# File lib/bluekai/request.rb, line 16
def run
  response = http_request
  fail Bluekai::RequestFailed, response.body unless response.code.start_with?('2')
  return :success if response.body.nil? || response.body.strip.empty?
  JSON.parse(response.body, symbolize_names: true)
end
signature() click to toggle source

HMAC-SHA256(Secret key, HTTP_METHOD + URI_PATH + QUERY_ARG_VALUES + POST_DATA)

# File lib/bluekai/request.rb, line 24
def signature
  digest = OpenSSL::Digest.new('sha256')
  hmac = OpenSSL::HMAC.digest(digest, api_private_key, string_to_sign)
  CGI.escape(Base64.strict_encode64(hmac))
end

Private Instance Methods

body_sorted() click to toggle source
# File lib/bluekai/request.rb, line 56
def body_sorted
  # sort hash according to keys for correct signature computation
  body.sort_by { |key, _value| key.to_s }.to_h.to_json if body
end
http_request() click to toggle source
# File lib/bluekai/request.rb, line 34
def http_request
  case method
  when 'GET'
    HTTParty.get(url)
  when 'POST'
    HTTParty.post(url, non_get_params)
  when 'PUT'
    HTTParty.put(url, non_get_params)
  when 'DELETE'
    HTTParty.delete(url, non_get_params)
  end.response
end
json_headers() click to toggle source
# File lib/bluekai/request.rb, line 61
def json_headers
  {
    'Accept' => 'application/json',
    'Content-type' => 'application/json'
  }
end
non_get_params() click to toggle source
# File lib/bluekai/request.rb, line 47
def non_get_params
  { body: body_sorted, headers: json_headers }
end
query_string(params = nil, prefix = '') click to toggle source
# File lib/bluekai/request.rb, line 73
def query_string(params = nil, prefix = '')
  # converts a (nested) hash of query parameters into a query string.
  (params || query || {})
    .map { |k, v| v.is_a?(Hash) ? query_string(v, "#{k}=") : "#{prefix}#{k}=#{v}" }
    .join('&')
end
query_values() click to toggle source
# File lib/bluekai/request.rb, line 68
def query_values
  return nil unless query
  query_string.split('&').map { |p| p.split('=', 2)[1] }.join
end
string_to_sign() click to toggle source
# File lib/bluekai/request.rb, line 80
def string_to_sign
  # see the example here: https://kb.bluekai.com/display/PD/Programming+Example
  method + path + query_values.to_s + body_sorted.to_s
end
url() click to toggle source
# File lib/bluekai/request.rb, line 51
def url
  "#{domain}#{path}?#{query_string}"\
    "&bkuid=#{api_user_key}&bksig=#{signature}"
end