Class: Sequent::Core::AggregateRoot

Inherits:
Object
  • Object
show all
Includes:
Helpers::MessageHandler, SnapshotConfiguration
Defined in:
lib/sequent/core/aggregate_root.rb

Overview

Base class for all your domain classes.

load_from_history functionality to be loaded_from_history, meaning a stream of events.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from SnapshotConfiguration

included

Methods included from Helpers::MessageHandler

#handle_message, included

Constructor Details

#initialize(id) ⇒ AggregateRoot

Returns a new instance of AggregateRoot.



52
53
54
55
56
57
58
59
# File 'lib/sequent/core/aggregate_root.rb', line 52

def initialize(id)
  @id = id
  @uncommitted_events = []
  @sequence_number = 1
  @event_stream = EventStream.new aggregate_type: self.class.name,
                                  aggregate_id: id,
                                  snapshot_threshold: self.class.snapshot_default_threshold
end

Instance Attribute Details

#event_streamObject (readonly)

Returns the value of attribute event_stream.



38
39
40
# File 'lib/sequent/core/aggregate_root.rb', line 38

def event_stream
  @event_stream
end

#idObject (readonly)

Returns the value of attribute id.



38
39
40
# File 'lib/sequent/core/aggregate_root.rb', line 38

def id
  @id
end

#sequence_numberObject (readonly)

Returns the value of attribute sequence_number.



38
39
40
# File 'lib/sequent/core/aggregate_root.rb', line 38

def sequence_number
  @sequence_number
end

#uncommitted_eventsObject (readonly)

Returns the value of attribute uncommitted_events.



38
39
40
# File 'lib/sequent/core/aggregate_root.rb', line 38

def uncommitted_events
  @uncommitted_events
end

Class Method Details

.load_from_history(stream, events) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/sequent/core/aggregate_root.rb', line 40

def self.load_from_history(stream, events)
  first, *rest = events
  if first.is_a? SnapshotEvent
    aggregate_root = Marshal.load(Base64.decode64(first.data))
    rest.each { |x| aggregate_root.apply_event(x) }
  else
    aggregate_root = allocate() # allocate without calling new
    aggregate_root.load_from_history(stream, events)
  end
  aggregate_root
end

Instance Method Details

#apply_event(event) ⇒ Object



83
84
85
86
# File 'lib/sequent/core/aggregate_root.rb', line 83

def apply_event(event)
  handle_message(event)
  @sequence_number = event.sequence_number + 1
end

#clear_eventsObject



74
75
76
# File 'lib/sequent/core/aggregate_root.rb', line 74

def clear_events
  @uncommitted_events = []
end

#load_from_history(stream, events) ⇒ Object



61
62
63
64
65
66
67
68
# File 'lib/sequent/core/aggregate_root.rb', line 61

def load_from_history(stream, events)
  raise "Empty history" if events.empty?
  @id = events.first.aggregate_id
  @uncommitted_events = []
  @sequence_number = 1
  @event_stream = stream
  events.each { |event| apply_event(event) }
end

#take_snapshot!Object



78
79
80
81
# File 'lib/sequent/core/aggregate_root.rb', line 78

def take_snapshot!
  snapshot = build_event SnapshotEvent, data: Base64.encode64(Marshal.dump(self))
  @uncommitted_events << snapshot
end

#to_sObject



70
71
72
# File 'lib/sequent/core/aggregate_root.rb', line 70

def to_s
  "#{self.class.name}: #{@id}"
end