class Dry::Facts::Aggregate
Attributes
events[R]
id[RW]
uuid[RW]
Public Class Methods
aggregate_data_from_event_types(*event_klasses)
click to toggle source
# File lib/dry/facts/aggregate.rb, line 15 def aggregate_data_from_event_types *event_klasses event_klasses.each do |klass| define_event_type_handler klass, :_transfer_data_from_event end end
build_all_from_events(events)
click to toggle source
# File lib/dry/facts/aggregate.rb, line 21 def build_all_from_events events events .group_by {|e| e.aggregate_id } .map {|_, g_events| build_one_from_events(g_events) } end
build_one_from_events(events)
click to toggle source
# File lib/dry/facts/aggregate.rb, line 27 def build_one_from_events events self .new(events) end
define_event_type_handler(klass, method_name)
click to toggle source
# File lib/dry/facts/aggregate.rb, line 32 def define_event_type_handler klass, method_name @event_handlers ||= {} @event_handlers[klass.name] = method_name end
event_handlers()
click to toggle source
# File lib/dry/facts/aggregate.rb, line 37 def event_handlers @event_handlers end
event_types()
click to toggle source
# File lib/dry/facts/aggregate.rb, line 41 def event_types @event_handlers.keys end
find_event_handler(key)
click to toggle source
# File lib/dry/facts/aggregate.rb, line 45 def find_event_handler(key) (@event_handlers)[key] end
new(events)
click to toggle source
# File lib/dry/facts/aggregate.rb, line 50 def initialize(events) @events = events || [] first_event_aggregate_id= if @events.first @events.first.aggregate_id end @uuid = @id = first_event_aggregate_id @events.each {|e| self.send :_handle_event, e} end
Public Instance Methods
to_h()
click to toggle source
# File lib/dry/facts/aggregate.rb, line 60 def to_h self .instance_variables .map {|ivar_name| ivar_name.to_s.gsub(/@/, '')} .yield_self {|ivars| ivars - ['events', 'uuid']} .reduce(Hash.new) {|memo, obj| memo[obj.to_sym] = self.send(obj); memo } end
Also aliased as: to_hash
Private Instance Methods
_default_aggregate_metadata()
click to toggle source
# File lib/dry/facts/aggregate.rb, line 71 def _default_aggregate_metadata uuid = SecureRandom.uuid, { id: uuid, uuid: uuid, type: { name: self.class.name } } end
_handle_event(event)
click to toggle source
# File lib/dry/facts/aggregate.rb, line 78 def _handle_event event if self.uuid != event.metadata[:aggregate_id] fail "Event don't belong to aggregate instance. \n Aggregate #{self.inspect} \n Event: #{event.inspect}" end handler_name = self .class .find_event_handler(event.metadata[:type][:name]) self.send(handler_name, event) if handler_name end
_transfer_data_from_event(event)
click to toggle source
# File lib/dry/facts/aggregate.rb, line 93 def _transfer_data_from_event event event.data.keys.each do |key| if :id == key.to_sym self.send "#{key}=", event.aggregate_id else self.send "#{key}=", event.data[key] end end end