lib/event_sourcery/repository.rb in event_sourcery-0.14.0 vs lib/event_sourcery/repository.rb in event_sourcery-0.15.0
- old
+ new
@@ -1,21 +1,49 @@
module EventSourcery
+ # This class provides a set of methods to help load and save aggregate instances.
+ #
+ # Refer to {https://github.com/envato/event_sourcery_todo_app/blob/31e200f4a2a65be5d847a66a20e23a334d43086b/app/commands/todo/amend.rb#L26 EventSourceryTodoApp}
+ # for a more complete example.
+ # @example
+ # repository = EventSourcery::Repository.new(
+ # event_source: EventSourceryTodoApp.event_source,
+ # event_sink: EventSourceryTodoApp.event_sink,
+ # )
+ #
+ # aggregate = repository.load(Aggregates::Todo, command.aggregate_id)
+ # aggregate.amend(command.payload)
+ # repository.save(aggregate)
class Repository
+ # Create a new instance of the repository and load an aggregate instance
+ #
+ # @param aggregate_class Aggregate type
+ # @param aggregate_id [Integer] ID of the aggregate instance to be loaded
+ # @param event_source event source to be used for loading the events for the aggregate
+ # @param event_sink event sink to be used for saving any new events for the aggregate
def self.load(aggregate_class, aggregate_id, event_source:, event_sink:)
new(event_source: event_source, event_sink: event_sink)
.load(aggregate_class, aggregate_id)
end
+ # @param event_source event source to be used for loading the events for the aggregate
+ # @param event_sink event sink to be used for saving any new events for the aggregate
def initialize(event_source:, event_sink:)
@event_source = event_source
@event_sink = event_sink
end
+ # Load an aggregate instance
+ #
+ # @param aggregate_class Aggregate type
+ # @param aggregate_id [Integer] ID of the aggregate instance to be loaded
def load(aggregate_class, aggregate_id)
events = event_source.get_events_for_aggregate_id(aggregate_id)
aggregate_class.new(aggregate_id, events)
end
+ # Save any new events/changes in the provided aggregate to the event sink
+ #
+ # @param aggregate An aggregate instance to be saved
def save(aggregate)
new_events = aggregate.changes
if new_events.any?
event_sink.sink(new_events,
expected_version: aggregate.version - new_events.count)