lib/eventq/eventq_aws/sqs.rb

Summary

Maintainability
A
0 mins
Test Coverage
B
87%
# frozen_string_literal: true

module EventQ
  module Amazon
    # Helper SQS class to handle the API calls
    class SQS
      @@queue_arns = Concurrent::Hash.new
      @@queue_urls = Concurrent::Hash.new

      attr_reader :sqs

      def initialize(client)
        @sqs = client
      end

      # Create a new queue.
      def create_queue(queue, attributes = {})
        _queue_name = EventQ.create_queue_name(queue)

        url = get_queue_url(queue)
        unless url
          response = sqs.create_queue(
            {
              queue_name: aws_safe_name(_queue_name),
              attributes: attributes
            }
          )
          url = response.queue_url
          @@queue_urls[_queue_name] = url
        end

        url
      end

      # Update a queue
      def update_queue(queue, attributes = {})
        url = get_queue_url(queue)
        sqs.set_queue_attributes(
          {
            queue_url: url, # required
            attributes: attributes
          }
        )

        url
      end

      # Returns the ARN of a queue.  If none exists, nil will be returned.
      #
      # @param queue [EventQ::Queue]
      # @return ARN [String]
      def get_queue_arn(queue)
        _queue_name = EventQ.create_queue_name(queue)

        arn = @@queue_arns[_queue_name]
        unless arn
          url = get_queue_url(queue)
          if url
            response = sqs.get_queue_attributes(
              {
                queue_url: url,
                attribute_names: ['QueueArn']
              }
            )
            arn = response.attributes['QueueArn']
          end
        end

        arn
      end

      # Returns the URL of the queue. If none exists, nil will be returned.
      #
      # @param queue [EventQ::Queue]
      # @return URL [String]
      def get_queue_url(queue)
        _queue_name = EventQ.create_queue_name(queue)

        url = @@queue_urls[_queue_name]
        unless url
          begin
            response= sqs.get_queue_url(
                queue_name: aws_safe_name(_queue_name)
            )
            url = response.queue_url
          rescue Aws::SQS::Errors::NonExistentQueue
            # Only want to return nil for this method when not found.
          end

          @@queue_urls[_queue_name] = url if url
        end

        url
      end

      def drop_queue(queue)
        q = get_queue_url(queue)
        sqs.delete_queue(queue_url: q)

        _queue_name = EventQ.create_queue_name(queue)
        @@queue_urls.delete(_queue_name)
        @@queue_arns.delete(_queue_name)

        true
      end

      def aws_safe_name(name)
        return name[0..79].gsub(/[^a-zA-Z\d_\-]/,'')
      end
    end
  end
end