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