class Clockwork::DatabaseEvents::EventStore

Attributes

Public Class Methods

new(block_to_perform_on_event_trigger) click to toggle source
# File lib/clockwork/database_events/event_store.rb, line 32
def initialize(block_to_perform_on_event_trigger)
  @related_events = {}
  @block_to_perform_on_event_trigger = block_to_perform_on_event_trigger
end

Public Instance Methods

register(event, model) click to toggle source

DatabaseEvents::Manager#register creates a new DatabaseEvents::Event, whose initialize method registers the new database event with the EventStore by calling this method.

# File lib/clockwork/database_events/event_store.rb, line 40
def register(event, model)
  related_events_for(model.id).add(event)
end
register_new_models(model_objects) click to toggle source
# File lib/clockwork/database_events/event_store.rb, line 64
def register_new_models(model_objects)
  unregistered_models(model_objects).each do |new_model_object|
    register_with_manager(new_model_object)
  end
end
unregister_all_except(model_objects) click to toggle source
# File lib/clockwork/database_events/event_store.rb, line 50
def unregister_all_except(model_objects)
  ids = model_objects.collect(&:id)
  (@related_events.keys - ids).each{|id| unregister(id) }
end
update(current_model_objects) click to toggle source
# File lib/clockwork/database_events/event_store.rb, line 44
def update(current_model_objects)
  unregister_all_except(current_model_objects)
  update_registered_models(current_model_objects)
  register_new_models(current_model_objects)
end
update_registered_models(model_objects) click to toggle source
# File lib/clockwork/database_events/event_store.rb, line 55
def update_registered_models(model_objects)
  registered_models(model_objects).each do |model|
    if has_changed?(model)
      unregister(model.id)
      register_with_manager(model)
    end
  end
end

Private Instance Methods

at_strings_for(model) click to toggle source
# File lib/clockwork/database_events/event_store.rb, line 132
def at_strings_for(model)
  return nil if model.at.to_s.empty?

  model.at.split(',').map(&:strip)
end
has_changed?(model) click to toggle source
# File lib/clockwork/database_events/event_store.rb, line 78
def has_changed?(model)
  related_events_for(model.id).has_changed?(model)
end
options(model) click to toggle source
# File lib/clockwork/database_events/event_store.rb, line 111
def options(model)
  options = {
    :from_database => true,
    :synchronizer => self,
    :ignored_attributes => [],
  }

  options[:at] = at_strings_for(model) if model.respond_to?(:at)
  options[:if] = ->(time){ model.if?(time) } if model.respond_to?(:if?)
  options[:tz] = model.tz if model.respond_to?(:tz)
  options[:ignored_attributes] = model.ignored_attributes if model.respond_to?(:ignored_attributes)

  # store the state of the model at time of registering so we can
  # easily compare and determine if state has changed later
  options[:model_attributes] = model.attributes.select do |k, v|
    not options[:ignored_attributes].include?(k.to_sym)
  end

  options
end
register_with_manager(model) click to toggle source

When re-creating events, the Clockwork.manager must be used to create them, as it is ultimately responsible for ensuring that the events actually get run when they should. We call its every method, which will result in DatabaseEvent::Manager#register being called, which creates a new DatabaseEvent::Event, which will be registered with the EventStore on initialize.

# File lib/clockwork/database_events/event_store.rb, line 105
def register_with_manager(model)
  Clockwork.manager.
    every(model.frequency, model, options(model),
          &@block_to_perform_on_event_trigger)
end
registered?(model) click to toggle source
# File lib/clockwork/database_events/event_store.rb, line 74
def registered?(model)
  related_events_for(model.id) != nil
end
registered_models(model_objects) click to toggle source
# File lib/clockwork/database_events/event_store.rb, line 86
def registered_models(model_objects)
  model_objects.select{|m| registered?(m) }
end
unregister(id) click to toggle source
# File lib/clockwork/database_events/event_store.rb, line 94
def unregister(id)
  related_events_for(id).unregister
  related_events.delete(id)
end
unregistered_models(model_objects) click to toggle source
# File lib/clockwork/database_events/event_store.rb, line 90
def unregistered_models(model_objects)
  model_objects.select{|m| !registered?(m) }
end