class Circuitry::Provisioning::SubscriptionCreator

Attributes

queue[RW]
topics[RW]

Public Class Methods

new(queue, topics) click to toggle source
# File lib/circuitry/provisioning/subscription_creator.rb, line 17
def initialize(queue, topics)
  raise ArgumentError, 'queue must be a Circuitry::Queue' unless queue.is_a?(Circuitry::Queue)
  raise ArgumentError, 'topics must be an array' unless topics.is_a?(Array)

  self.queue = queue
  self.topics = topics
end
subscribe_all(queue, topics) click to toggle source
# File lib/circuitry/provisioning/subscription_creator.rb, line 13
def self.subscribe_all(queue, topics)
  new(queue, topics).subscribe_all
end

Public Instance Methods

subscribe_all() click to toggle source
# File lib/circuitry/provisioning/subscription_creator.rb, line 25
def subscribe_all
  topics.each do |topic|
    sns.subscribe(topic_arn: topic.arn, endpoint: queue.arn, protocol: 'sqs')
  end

  if topics.any?
    sqs.set_queue_attributes(queue_url: queue.url, attributes: build_policy)
  end
end

Private Instance Methods

build_policy() click to toggle source
# File lib/circuitry/provisioning/subscription_creator.rb, line 40
def build_policy
  # The aws ruby SDK doesn't have a policy builder :{
  {
    'Policy' => {
      'Version'   => '2012-10-17',
      'Id'        => "#{queue.arn}/SNSPolicy",
      'Statement' => [build_policy_statement]
    }.to_json
  }
end
build_policy_statement() click to toggle source
# File lib/circuitry/provisioning/subscription_creator.rb, line 51
def build_policy_statement
  {
    'Sid'       => "Sid-#{queue.name}-subscriptions",
    'Effect'    => 'Allow',
    'Principal' => { 'AWS' => '*' },
    'Action'    => 'SQS:SendMessage',
    'Resource'  => queue.arn,
    'Condition' => {
      'ForAnyValue:ArnEquals' => { 'aws:SourceArn' => topics.map(&:arn) }
    }
  }
end