class TyreshopperSqs2cb::MessageHandler

Public Class Methods

new() click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 12
def initialize

  logfile = ENV['TYRESHOPPER_SQS2CB_LOGFILE_PATH'].nil? ? STDOUT : File.open(ENV['TYRESHOPPER_SQS2CB_LOGFILE_PATH'], 'a')
  logfile.sync = true
  @logger = Logger.new logfile


  @sqs2cb = ::Sqs2cb::MessageHandler.new

end

Public Instance Methods

handle_received_message(message, options) click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 33
def handle_received_message(message, options)
  @options = options
  @logger.info "Tyreshopper Message received."
  @logger.debug message.body
  @logger.info "Sending..."

  @caseBlocksAPIEndpoint = options[:case_blocks_api_endpoint]
  @caseBlocksAPIToken = options[:caseblocks_api_token]

  send_to_caseblocks(JSON.parse(message.body))

rescue JSON::ParserError => ex
  # TODO needs some form of remote notification that an error occured.
  @logger.error "Bad message format. Unable to deserialize message into JSON."
  @logger.error ex
rescue Exception => ex
  @logger.error "Something caused a message handling failure."
  @logger.error ex
end
send_to_caseblocks(msgHash) click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 54
def send_to_caseblocks(msgHash)
  @logger.info "Sending to CaseBlocks"

  @logger.info "Sending order #{msgHash["case"]["title"]} to caseblocks..."

  @logger.info "Looking for customer..."
  customer = find_or_create_customer(msgHash)

  msgHash["case"]["customer_ref"] = customer["customer_ref"]

  @logger.info "Creating order in caseblocks..."
  response = post("/case_blocks/tyre_shopper_orders", msgHash)

  @logger.info "Done."
  @logger.info "Received #{response}"
rescue RestClient::ExceptionWithResponse => ex
  if ex.response.nil?
    @logger.error "Received a bad response (null) from CaseBlocks. Re-raising."
    raise ex
  else
    @logger.error "Received #{ex.response.code} bad response: #{ex.response.body}"
  end
end
stop() click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 23
def stop
  @sqs2cb.stop
end
transfer_messages() click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 27
def transfer_messages
  @sqs2cb.transfer_messages do |message, options|
    handle_received_message(message, options)
  end
end

Private Instance Methods

customer_case_type_id() click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 163
def customer_case_type_id
  @customer_case_type_id ||= get("/case_blocks/people_types")["people_types"].select{|type| type["code"] == "customer" }.first["id"]
end
ensure_taskslists_are_populated(customer) click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 180
def ensure_taskslists_are_populated(customer)
  ap customer
  # populate tasklists
  tasklists = []
  customer["tasklists"].each do |tasklist_id|
    tasklists << get("/case_blocks/tasklists/#{tasklist_id}")
  end

  customer["tasklists"] = tasklists

  return customer
end
find_customer(query) click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 167
def find_customer(query)

  result = get("/case_blocks/search", {"query" => query.map{|k,v| "#{k}%3A#{v}"}.join(" AND ")})
  matches = result.detect{|type| type["case_type_id"] == customer_case_type_id}

  if !matches.nil? && matches["cases"].count > 0
    return matches["cases"].first
  else
    return nil
  end

end
find_or_create_customer(options) click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 79
def find_or_create_customer(options)

  # find customer case type id
  order_details = options["case"]

  # if user was signed in then use member_id else use email
  if order_details["signed_in"]

    @logger.info "Searching for customer on member_id #{order_details["member"]["member_id"]}..."

    customer = {
      "case_type_id" => customer_case_type_id,
      "people_type_id" => customer_case_type_id,
      "address_1" => order_details["member"]["address1"],
      "address_2" => order_details["member"]["address2"],
      "county" => order_details["member"]["county"],
      "prefix" => order_details["member"]["prefix"],
      "first_name" => order_details["member"]["first_name"],
      "surname" => order_details["member"]["surname"],
      "postcode" => order_details["member"]["postcode"],
      "town" => order_details["member"]["town"],
      "email" => order_details["member"]["email"],
      "member_id" => order_details["member"]["member_id"].to_i,
      }

    cb_customer = find_customer(:member_id => order_details["member"]["member_id"])
    if cb_customer.nil?
      @logger.info "Can't find customer by member_id, checking if the email is there..."

      cb_customer = find_customer(:email => order_details["email"])

      if cb_customer
        @logger.info "Found customer, need to update member_id and data"

        cb_customer = ensure_taskslists_are_populated(cb_customer)
        put("/case_blocks/customer/#{cb_customer["_id"]}", {"customer" => customer})

        return cb_customer
      else
        @logger.info "Unable to find customer"
        @logger.info "Creating new customer from member details..."

        result = post("/case_blocks/customer", customer)["case"]
        return result
      end
    else
      return cb_customer
    end
  else
    @logger.info "Searching for customer on email #{order_details["email"]}..."

    cb_customer = find_customer(:email => order_details["email"])

    if cb_customer
      @logger.info "Found customer"
      return cb_customer
    else
      @logger.info "Unable to find customer"

      name_parts = parse_name(order_details["customer"])

      customer = {
        :case_type_id => customer_case_type_id,
        :people_type_id => customer_case_type_id,
        :address_1 => order_details["address1"],
        :address_2 => order_details["address2"],
        :town => order_details["address3"],
        :postcode => order_details["postcode"],

        :prefix => name_parts[:prefix],
        :first_name => name_parts[:first_name],
        :surname => name_parts[:surname],
        :email => order_details["email"],

        }

        @logger.info "Creating new customer from order details..."
        return post("/case_blocks/customer", customer)["case"]
    end
  end
end
get(path, query={}) click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 214
def get(path, query={})
  uri = URI.parse("#{@caseBlocksAPIEndpoint}#{path}")

  query.each do |k, v|
    uri.query = [uri.query, "#{k}=#{v}"].compact.join('&')
  end
  uri.query = [uri.query, "auth_token=#{@caseBlocksAPIToken}"].compact.join('&')
  ap " === GETing to #{uri.to_s} ==="
  return JSON.parse(RestClient.get(uri.to_s, :content_type => :json, :accept => :json, "AUTH_TOKEN" => @caseBlocksAPIToken))
end
parse_name(full_name) click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 193
def parse_name(full_name)
  valid_prefix = %w(dr miss mr mrs ms professor sir)

  parts = full_name.split(" ")

  result = {:prefix => "", :first_name => "", :last_name => ""}

  if valid_prefix.include?(parts[0].downcase)
    result[:prefix] = titleize(parts.delete_at(0))
  end

  result[:first_name] = parts.delete_at(0)

  result[:surname] = parts.join(" ")

  return result
end
patch(path, data, options={}) click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 247
def patch(path, data, options={})
  uri = URI.parse("#{@caseBlocksAPIEndpoint}#{path}")

  options = {:content_type => :json, :accept => :json, "AUTH_TOKEN" => @caseBlocksAPIToken}.merge(options)

  uri.query = [uri.query, "auth_token=#{@caseBlocksAPIToken}"].compact.join('&')
  ap " === PATCHing to #{uri.to_s} ==="
  #ap data
  return JSON.parse(RestClient.patch(uri.to_s, data.to_json, options))
end
post(path, data, options={}) click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 225
def post(path, data, options={})
  uri = URI.parse("#{@caseBlocksAPIEndpoint}#{path}")

  options = {:content_type => :json, :accept => :json, "AUTH_TOKEN" => @caseBlocksAPIToken}.merge(options)

  uri.query = [uri.query, "auth_token=#{@caseBlocksAPIToken}"].compact.join('&')
  ap " === POSTing to #{uri.to_s} ==="
  #ap data
  return JSON.parse(RestClient.post(uri.to_s, data.to_json, options))
end
put(path, data, options={}) click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 236
def put(path, data, options={})
  uri = URI.parse("#{@caseBlocksAPIEndpoint}#{path}")

  options = {:content_type => :json, :accept => :json, "AUTH_TOKEN" => @caseBlocksAPIToken}.merge(options)

  uri.query = [uri.query, "auth_token=#{@caseBlocksAPIToken}"].compact.join('&')
  ap " === PUTing to #{uri.to_s} ==="
  #ap data
  return JSON.parse(RestClient.put(uri.to_s, data.to_json, options))
end
titleize(str) click to toggle source
# File lib/tyreshopper_sqs2cb.rb, line 210
def titleize(str)
  return str[0].upcase + str[1..-1].downcase
end