class Moogle::Handlers::AcceptNotification

Handler that accepts Moogle::Messges::Notifications and creates actual push requests to relay the notification to each found target.

Constants

DEFAULT_PUSH_OPTIONS

Attributes

default_options[R]
pusher_queue[R]

Public Class Methods

new() click to toggle source
# File lib/moogle/handlers/accept_notification.rb, line 34
def initialize
  @pusher_queue = opts! :pusher_queue
  @default_options = opts :default_push_options, DEFAULT_PUSH_OPTIONS
end

Public Instance Methods

call() click to toggle source
# File lib/moogle/handlers/accept_notification.rb, line 39
def call
  return nil if request.receiver_refs.blank? || request.message_kind.blank?

  # Get all targets whose links' kinds + receivers match.
  model = opts :model, Moogle::Target
  targets = model.all(
    model.links.message_kind => request.message_kind,
    model.links.receiver_ref => request.receiver_refs)

  # Create a new push request for each target found.
  # Push each request to the pusher queue, and errors are caught
  # and pushed to the error channel.
  targets.each do |target|
    with_error_handling(
        kind: 'moogle/handlers/accept_notification',
        request: request.to_hash,
        target_id: target.id) do
      request_factory = request_factory_for target.type
      push_data = [
        request.attributes,
        default_options,
        target.options,
        {
          target_id: target.id,
          message_origin: "#{request.message_kind}:#{request.uuid}:"
        }
      ].reduce(&:merge)
      push_request = request_factory.build push_data
      pusher_queue.push push_request.to_hash
    end
  end

  return nil
rescue => e
  e.extend Moogle::Error
  raise e
end
request_factory_for(target_type) click to toggle source
# File lib/moogle/handlers/accept_notification.rb, line 77
def request_factory_for(target_type)
  case target_type.to_s
  when 'Moogle::BlogTarget'
    Moogle::Requests::PushBlogEntry
  when 'Moogle::EmailTarget'
    Moogle::Requests::PushEmail
  #when 'Moogle::FacebookTarget'
  #  Moogle::Requests::PushFacebookAction
  #when 'Moogle::TwitterTarget'
  #  Moogle::Requests::PushTweet
  when 'Moogle::WebhookTarget'
    Moogle::Requests::PushWebhookPing
  else
    raise ArgumentError, "Unsupported Target #{target_type}"
  end
end