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
to_hash()
Alias for: to_h

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