class Sqs2cb::MessageHandler
Public Class Methods
new()
click to toggle source
# File lib/sqs2cb.rb, line 9 def initialize @awsAccessKeyId = ENV['AWS_ACCESS_KEY'] @awsSecretAccessKey = ENV['AWS_SECRET_ACCESS_KEY'] @caseBlocksAPIEndpoint = ENV['CB_API_ENDPOINT'] @caseBlocksAPIToken = ENV['CB_API_TOKEN'] @caseBlocksQueue = ENV['CB_QUEUE'] @usePatchCommand = (@caseBlocksQueue =~ /patch/) logfile = ENV['SQS2CB_LOGFILE_PATH'].nil? ? STDOUT : File.open(ENV['SQS2CB_LOGFILE_PATH'], 'a') logfile.sync = true @logger = Logger.new logfile @stop = false @options = {:use_patch_command => @usePatchCommand, :case_blocks_api_endpoint => @caseBlocksAPIEndpoint, :caseblocks_api_token => @caseBlocksAPIToken} raise RuntimeError, "Please ensure AWS_ACCESS_KEY is set." if @awsAccessKeyId.nil? or @awsAccessKeyId.empty? raise RuntimeError, "Please ensure AWS_SECRET_ACCESS_KEY is set." if @awsSecretAccessKey.nil? or @awsSecretAccessKey.empty? raise RuntimeError, "Please ensure CB_API_ENDPOINT is set." if @caseBlocksAPIEndpoint.nil? or @caseBlocksAPIEndpoint.empty? raise RuntimeError, "Please ensure CB_API_TOKEN is set." if @caseBlocksAPIToken.nil? or @caseBlocksAPIToken.empty? @logger.info "MessageHandler ready to transfer messages." end
Public Instance Methods
handle_received_message(message)
click to toggle source
# File lib/sqs2cb.rb, line 53 def handle_received_message(message) @logger.info "Message received." @logger.debug message.body if @usePatchCommand update_caseblocks(JSON.parse(message.body)) else send_to_caseblocks(JSON.parse(message.body)) end 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/sqs2cb.rb, line 97 def send_to_caseblocks(msgHash) @logger.info "Sending to CaseBlocks" response = RestClient.post("#{@caseBlocksAPIEndpoint}/case_blocks/cases?auth_token=#{@caseBlocksAPIToken}", msgHash.to_json, :content_type => :json, :accept => :json, "AUTH_TOKEN" => @caseBlocksAPIToken) @logger.info "Received #{response.code} Location: #{response.headers[:location]}" 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/sqs2cb.rb, line 31 def stop @stop = true end
transfer_messages() { |message, options| ... }
click to toggle source
# File lib/sqs2cb.rb, line 35 def transfer_messages @logger.info "MessageHandler awaiting first message." begin sqs = AWS::SQS.new(region: 'us-east-1', access_key_id: @awsAccessKeyId, secret_access_key: @awsSecretAccessKey) sqs.queues[@caseBlocksQueue].poll do |message| if block_given? yield message, @options else handle_received_message(message) end return if @stop end rescue Exception => ex @logger.error "Something cause an SQS failure." @logger.error ex end end
update_caseblocks(msgHash)
click to toggle source
# File lib/sqs2cb.rb, line 70 def update_caseblocks(msgHash) caseId = msgHash.delete('id') caseTypeCode = msgHash.delete('case_type_code') initialResponse = RestClient.get("#{@caseBlocksAPIEndpoint}/case_blocks/#{caseTypeCode}/#{caseId}.json?auth_token=#{@caseBlocksAPIToken}", :content_type => :json, :accept => :json, "AUTH_TOKEN" => @caseBlocksAPIToken) currentCase = JSON.parse(initialResponse.body) data = currentCase[caseTypeCode] data.merge!(msgHash) %w(tasklists conversations).each {|k| data.delete k} currentCase[caseTypeCode] = data secondResponse = RestClient.put("#{@caseBlocksAPIEndpoint}/case_blocks/#{caseTypeCode}/#{caseId}.json?auth_token=#{@caseBlocksAPIToken}", currentCase.to_json, :content_type => :json, :accept => :json, "AUTH_TOKEN" => @caseBlocksAPIToken) @logger.info "Received #{secondResponse.code}" 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