class Lipstick::Api::Session

Attributes

base_url[R]

API endpoint, eg. example.com/admin

credentials[R]

Hash containing :username, :password

logger[R]

Used for logging request and response info.

Public Class Methods

new(params) click to toggle source

Public: Initialize session.

params - Hash

  • :url - API endpoint, eg. example.com/admin

  • :username

  • :password

  • :logger - Used for logging request and response info.

# File lib/lipstick/api/session.rb, line 24
def initialize(params)
  @base_url = params[:url] || raise("url not defined.")
  raise("username missing") unless params[:username]
  raise("password missing") unless params[:password]
  @credentials = { username: params[:username], password: params[:password] }
  @logger   = params[:logger] || Logger.new('/dev/null')
end

Public Instance Methods

camelize(str) click to toggle source
# File lib/lipstick/api/session.rb, line 125
def camelize(str)
  return str.to_s unless str.to_s.include?(?_)
  str.to_s.split("_").each {|s| s.capitalize! }.join
end
campaign_find_active() click to toggle source

Find all active campaigns.

# File lib/lipstick/api/session.rb, line 33
def campaign_find_active
  call_api(:campaign_find_active)
end
campaign_view(campaign_id) click to toggle source

Fetch details for a given campaign.

# File lib/lipstick/api/session.rb, line 38
def campaign_view(campaign_id)
  call_api(:campaign_view, campaign_id: campaign_id)
end
customer_find_active_product(customer_id, campaign_id = nil) click to toggle source
# File lib/lipstick/api/session.rb, line 42
def customer_find_active_product(customer_id, campaign_id = nil)
  params = { customer_id: customer_id }
  params.merge!(campaign_id: campaign_id) if campaign_id
  call_api(:customer_find_active_product, params)
end
new_order(params) click to toggle source

Create order for new customer

# File lib/lipstick/api/session.rb, line 49
def new_order(params)
  camelcase_params!(params)
  call_api('NewOrder', params)
end
order_find(start_time, end_time, params = {}) click to toggle source
# File lib/lipstick/api/session.rb, line 54
def order_find(start_time, end_time, params = {})
  params.merge!(
    start_date: start_time.strftime('%m/%d/%Y'),
    start_time: start_time.strftime('%H:%M:%S'),
    end_date:   end_time.strftime('%m/%d/%Y'),
    end_time:   end_time.strftime('%H:%M:%S'))
  params[:campaign_id] ||= 'all'
  params[:product_id]  ||= 'all'
  params[:criteria]    ||= 'all'
  call_api(:order_find, params)
end
order_find_updated(start_time, end_time, params = {}) click to toggle source
# File lib/lipstick/api/session.rb, line 66
def order_find_updated(start_time, end_time, params = {})
  params.merge!(
    start_date: start_time.strftime('%m/%d/%Y'),
    start_time: start_time.strftime('%H:%M:%S'),
    end_date:   end_time.strftime('%m/%d/%Y'),
    end_time:   end_time.strftime('%H:%M:%S'))
  params[:campaign_id] ||= 'all'
  call_api(:order_find_updated, params)
end
order_refund(order_id, amount, keep_recurring = true) click to toggle source
# File lib/lipstick/api/session.rb, line 76
def order_refund(order_id, amount, keep_recurring = true)
  call_api(:order_refund,
           order_id: order_id,
           amount: amount.to_s,
           keep_recurring: keep_recurring ? '1' : '0')
end
order_update(order_id, action, value) click to toggle source
# File lib/lipstick/api/session.rb, line 83
def order_update(order_id, action, value)
  call_api(:order_update, order_ids: order_id, actions: action, values: value)
end
order_update_recurring(order_id, status) click to toggle source
# File lib/lipstick/api/session.rb, line 87
def order_update_recurring(order_id, status)
  call_api(:order_update_recurring, order_id: order_id, status: status)
end
order_view(order_id) click to toggle source
# File lib/lipstick/api/session.rb, line 91
def order_view(order_id)
  call_api(:order_view, order_id: order_id)
end
order_void(order_id) click to toggle source
# File lib/lipstick/api/session.rb, line 95
def order_void(order_id)
  call_api(:order_void, order_id: order_id)
end
shipping_method_find(campaign_id = 'all') click to toggle source
# File lib/lipstick/api/session.rb, line 99
def shipping_method_find(campaign_id = 'all')
  call_api(:shipping_method_find, campaign_id: campaign_id) do |fields|
    if fields[:response_code] == '100'
      [:shipping_ids].each do |key|
        fields[key] = CSV.parse_line(fields[key]).map(&:to_i)
      end
    end
  end
end
underscore(camel_cased_word) click to toggle source

partly copied from activesupport/inflector

# File lib/lipstick/api/session.rb, line 114
def underscore(camel_cased_word)
  word = camel_cased_word.to_s.dup
  word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
  word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
  word.tr!("-", "_")
  word.tr!("[", "_")
  word.tr!("]", "")
  word.downcase!
  word
end
validate_credentials() click to toggle source
# File lib/lipstick/api/session.rb, line 109
def validate_credentials
  call_api(:validate_credentials)
end

Protected Instance Methods

call_api(method, params = {}, &block) click to toggle source
# File lib/lipstick/api/session.rb, line 140
def call_api(method, params = {}, &block)
  params = params.merge(method: method)
  logger.info "request = #{params.inspect}"
  response = post_form(uri_for(method), params.merge(credentials))
  logger.info "response = #{response.inspect}"
  logger.debug "response.body = #{response.body}"
  if block_given?
    api_response = parse_response(response, &block)
  else
    fields = response_fields(response)
    klassname = "#{camelize(method)}Response".to_sym
    klass = Lipstick::Api.constants.include?(klassname) ? Lipstick::Api.const_get(klassname) : Lipstick::Api::Response
    api_response = klass.new(fields)
  end
  logger.info "API response = #{api_response.inspect}"
  api_response
end
camelcase_params!(params) click to toggle source

Munge params into style accepted by transaction API.

# File lib/lipstick/api/session.rb, line 132
def camelcase_params!(params)
  params.keys.select {|key| key.is_a?(Symbol) && key.to_s.include?(?_) }.each do |key|
    camelcase_key = camelize(key)
    camelcase_key[0] = camelcase_key[0].chr.downcase
    params[camelcase_key] = params.delete(key)
  end
end
parse_response(response) { |fields| ... } click to toggle source
# File lib/lipstick/api/session.rb, line 188
def parse_response(response, &block)
  fields = response_fields(response)
  yield fields if block_given?
  Lipstick::Api::Response.new(fields)
end
post_form(uri, params) click to toggle source
# File lib/lipstick/api/session.rb, line 163
def post_form(uri, params)
  post = Net::HTTP::Post.new(uri.request_uri)
  post.set_form_data(params)
  request(uri, post)
end
request(uri, request) click to toggle source
# File lib/lipstick/api/session.rb, line 169
def request(uri, request)
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  http.request(request)
end
response_fields(response) click to toggle source
# File lib/lipstick/api/session.rb, line 176
def response_fields(response)
  if response.body.include?(?=)
    CGI::unescape(response.body).split('&').inject({}) do |h,kv|
      k,v = kv.split('=')
      k = k.to_sym if k.match(/\w/)
      h.merge( k => v )
    end
  else
    { response_code: response.body }
  end
end
uri_for(method) click to toggle source
# File lib/lipstick/api/session.rb, line 158
def uri_for(method)
  api = ['NewOrder'].include?(method) ? 'transact' : 'membership'
  URI.parse("#{base_url}/#{api}.php")
end