class Riddl::Utils::Notifications::Producer::UpdateSubscription

Public Instance Methods

response() click to toggle source
# File lib/ruby/riddl/utils/notifications_producer.rb, line 270
def response
  backend = @a[0]
  handler = @a[1]
  key     = @r.last

  url  = @p[0].name == 'url' ? @p.shift.value : nil

  # TODO check if message is valid (with producer secret)
  unless backend.subscriptions[key]
    @status = 404
    return # subscription not found
  end

  topics = []
  backend.subscriptions[key].modify do |doc|
    if url.nil?
      doc.find('/n:subscription/@url').delete_all!
    else
      doc.root.attributes['url'] = url
    end
    doc.root.children.delete_all!
    while @p.length > 1
      topic = @p.shift.value
      base = @p.shift
      type = base.name
      items = base.value.split(',')
      t = if topics.include?(topic)
        doc.find("/n:subscription/n:topic[@id='#{topic}']").first
      else
        topics << topic
        doc.root.add('topic', :id => topic)
      end
      items.each do |i|
        t.add(type[0..-2], i)
      end
    end
  end

  handler.key(key).topics(topics).update unless handler.nil?
  nil
end