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