class Eventifier::TrackableClass

Public Class Methods

new(klass, klass_methods, options) click to toggle source
# File lib/eventifier/trackable_class.rb, line 8
def initialize(klass, klass_methods, options)
  @klass, @klass_methods = klass, klass_methods

  @attributes = options.delete(:attributes) || {}
  @owner      = options.delete :owner
  @group_by   = options.delete :group_by
end
track(klass, klass_methods, attributes) click to toggle source
# File lib/eventifier/trackable_class.rb, line 4
def self.track(klass, klass_methods, attributes)
  self.new(klass, klass_methods, attributes).track
end

Public Instance Methods

track() click to toggle source
# File lib/eventifier/trackable_class.rb, line 16
def track
  add_relations
  generate_observer_callbacks

  observer.instance

  Eventifier::EventSubscriber.subscribe_to_all @klass, @klass_methods
end

Private Instance Methods

add_relations() click to toggle source
# File lib/eventifier/trackable_class.rb, line 27
def add_relations
  @klass.class_eval do
    has_many :events, as: :eventable, class_name: 'Eventifier::Event',
      dependent: :destroy
    has_many :notifications, through: :events,
      class_name: 'Eventifier::Notification'
  end
end
generate_observer_callbacks() click to toggle source
# File lib/eventifier/trackable_class.rb, line 36
def generate_observer_callbacks
  methods, attributes, klass, owner, group_by =
    @klass_methods, @attributes, @klass, @owner, @group_by

  observer.class_eval do
    methods.each do |method|
      define_method "after_#{method}" do |object|
        Rails.logger.debug "||ASN|| Instrument #{method}.#{klass.name.tableize}" if defined?(Rails)
        ActiveSupport::Notifications.instrument(
          "#{method}.#{klass.name.tableize}.event.eventifier",
          event: method.to_sym,
          object: object,
          options: attributes,
          user: owner,
          group_by: group_by
        ) if object.changed?
      end
    end
  end
end
observer() click to toggle source
# File lib/eventifier/trackable_class.rb, line 57
def observer
  @observer ||= begin
    observer_klass.observe @klass

    observer_klass
  end
end
observer_klass() click to toggle source
# File lib/eventifier/trackable_class.rb, line 65
def observer_klass
  @observer_klass ||= if self.class.const_defined?("#{@klass}Observer")
    self.class.const_get("#{@klass}Observer")
  else
    constant_name = "#{@klass}Observer"
    klass         = Class.new(Eventifier::OBSERVER_CLASS)
    self.class.qualified_const_set(constant_name, klass)
  end
end