Sha256: c4bfb1dc4eb561a2ec18081c908415e81f624172ec61d51a7d3403f8ac43bfe3

Contents?: true

Size: 1.48 KB

Versions: 5

Compression:

Stored size: 1.48 KB

Contents

# -*- encoding : utf-8 -*-
require 'active_model'
require 'active_record/observer'
require 'active_record/callbacks'

module Untied
  module Publisher
    class Observer < ActiveRecord::Observer
      def initialize
        Publisher.config.logger.info "Untied: Initializing publisher observer"

        publisher.define_callbacks
        observed = publisher.observed_classes

        self.class.send(:define_method, :observed_classes, Proc.new { observed })
        super
      end

      def method_missing(name, model, *args, &block)
        if ActiveRecord::Callbacks::CALLBACKS.include?(name)
          options = args.first.is_a?(Hash) ? args.first : {}
          produce_event(name, model, options)
        else
          super
        end
      end

      protected

      def produce_event(callback, model, options={})
        e = Event.new(:name => callback, :payload => model,
                      :origin => Publisher.config.service_name,
                      :payload_representer => options[:represent_with])
        producer.publish(e)
      end

      def producer
        Publisher.adapter.producer.new
      end

      def publisher
        return @publisher if defined?(@publisher)

        unless Publisher.config.doorkeeper
          raise NameError.new "You should define a class which includes " + \
            "Untied::Publisher::Doorkeeper and set it name to Untied::Publisher.config.doorkeeper."
        end
        @publisher = Publisher.config.doorkeeper.new
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
untied-publisher-0.0.7.pre3 lib/untied-publisher/observer.rb
untied-publisher-0.0.7.pre2 lib/untied-publisher/observer.rb
untied-publisher-0.0.7.pre1 lib/untied-publisher/observer.rb
untied-publisher-0.0.7.pre lib/untied-publisher/observer.rb
untied-publisher-0.0.6 lib/untied-publisher/observer.rb