Class: Akasha::Repository

Inherits:
Object
  • Object
show all
Defined in:
lib/akasha/repository.rb

Overview

Aggregate repository. Not meant to be used directly (see aggregate/syntax_helpers.rb) See specs for usage.

Constant Summary collapse

STREAM_NAME_SEP =
'-'.freeze

Instance Method Summary collapse

Constructor Details

#initialize(store) ⇒ Repository

Creates a new repository using the underlying store (e.g. MemoryEventStore).



9
10
11
12
# File 'lib/akasha/repository.rb', line 9

def initialize(store)
  @store = store
  @subscribers = []
end

Instance Method Details

#load_aggregate(klass, id) ⇒ Object

Loads an aggregate identified by id and klass from the repository. Returns an aggregate instance of class klass constructed by applying events from the corresponding stream.



17
18
19
20
21
22
23
24
25
26
27
# File 'lib/akasha/repository.rb', line 17

def load_aggregate(klass, id)
  agg = klass.new(id)

  start = 0
  page_size = 20
  stream(klass, id).read_events(start, page_size) do |events|
    agg.apply_events(events)
  end

  agg
end

#save_aggregate(aggregate) ⇒ Object

Saves an aggregate to the repository, appending events to the corresponding stream.



30
31
32
33
34
# File 'lib/akasha/repository.rb', line 30

def save_aggregate(aggregate)
  changeset = aggregate.changeset
  stream(aggregate.class, changeset.aggregate_id).write_events(changeset.events)
  notify_subscribers(aggregate)
end

#subscribe(lambda = nil, &block) ⇒ Object

Subscribes to event streams passing either a lambda or a block. Example:

repo.subscribe do |aggregate_id, event|
  ... handle the event ...
end


42
43
44
45
# File 'lib/akasha/repository.rb', line 42

def subscribe(lambda = nil, &block)
  callable = lambda || block
  @subscribers << callable
end