Class: EntityStore::EventBus

Inherits:
Object
  • Object
show all
Includes:
Logging
Defined in:
lib/entity_store/event_bus.rb

Constant Summary collapse

ALL_METHOD =
:all_events

Instance Method Summary collapse

Methods included from Logging

#log_error

Instance Method Details

#feed_storeObject



44
45
46
# File 'lib/entity_store/event_bus.rb', line 44

def feed_store
  EntityStore::Config.feed_store
end

#publish(entity_type, event) ⇒ Object



7
8
9
10
11
12
# File 'lib/entity_store/event_bus.rb', line 7

def publish(entity_type, event)
  publish_to_feed entity_type, event

  subscribers_to(event.receiver_name).each do |s| send_to_subscriber s, event.receiver_name, event end
  subscribers_to_all.each do |s| send_to_subscriber s, ALL_METHOD, event end
end

#publish_to_feed(entity_type, event) ⇒ Object



40
41
42
# File 'lib/entity_store/event_bus.rb', line 40

def publish_to_feed(entity_type, event)
  feed_store.add_event(entity_type, event) if feed_store
end

#replay(since, type, subscriber) ⇒ Object

Public - replay events of a given type to a given subscriber

since - Time reference point type - String type name of event subscriber - Class of the subscriber to replay events to

Returns nothing



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/entity_store/event_bus.rb', line 55

def replay(since, type, subscriber)
  max_items = 100
  event_data_objects = feed_store.get_events(since, type, max_items)

  while event_data_objects.count > 0 do 
    event_data_objects.each do |event_data_object|
      begin
        event = EntityStore::Config.load_type(event_data_object.type).new(event_data_object.attrs)
        subscriber.new.send(event.receiver_name, event)
        log_info { "replayed #{event.inspect} to #{subscriber.name}##{event.receiver_name}" }
      rescue => e
        log_error "#{e.message} when replaying #{event_data_object.inspect} to #{subscriber}", e
      end
    end
    event_data_objects = feed_store.get_events(event_data_objects.last.id, type, max_items)
  end
end

#send_to_subscriber(subscriber, receiver_name, event) ⇒ Object



14
15
16
17
18
19
# File 'lib/entity_store/event_bus.rb', line 14

def send_to_subscriber subscriber, receiver_name, event
  subscriber.new.send(receiver_name, event)
  log_debug { "called #{subscriber.name}##{receiver_name} with #{event.inspect}" }
rescue => e
  log_error "#{e.message} when calling #{subscriber.name}##{receiver_name} with #{event.inspect}", e
end

#subscribersObject



29
30
31
32
33
34
35
36
37
38
# File 'lib/entity_store/event_bus.rb', line 29

def subscribers
  EntityStore::Config.event_subscribers.map do |subscriber|
    case subscriber
    when String
      Utils.get_type_constant(subscriber)
    else
      subscriber
    end
  end
end

#subscribers_to(event_name) ⇒ Object



21
22
23
# File 'lib/entity_store/event_bus.rb', line 21

def subscribers_to(event_name)
  subscribers.select { |s| s.instance_methods.include?(event_name.to_sym) }
end

#subscribers_to_allObject



25
26
27
# File 'lib/entity_store/event_bus.rb', line 25

def subscribers_to_all
  subscribers.select { |s| s.instance_methods.include?(ALL_METHOD) }
end