v0.19.0
RailsEventStore
-
Add:
publish_events(events)API which allows publishing a collection of events. Handlers are executed in the order the events were provided. First all handlers to the 1st event, then all handlers to the 2nd event and so on...publish_events([e0, e1])is equivalent topublish_event([e0]); publish_event([e1])but the events are stored transactionally (when usingRailsEventStoreActiveRecord).
RubyEventStore
- Add:
publish_events(events)API which allows publishing a collection of events. - Fix: Fix one-shot (dynamic) subscribers behavior when exception occurs during processing a block. A dynamic subscriber was not unsubscribed when an exception happened. Not it will be unsubscribed.
- Fix:
RubyEventStore::Event#hashmethod was implemented. Now identical events (in terms ofclass,event_idanddata) can be safely used as keys inHashor members of aSet. Notice:metadatais ignored when comparing events. - Change:
RubyEventStore::InMemoryRepositoryusesappend_to_stream(events, stream_name, expected_version)API instead ofcreate(event, stream_name) - Change:
RubyEventStore::InMemoryRepositorycan detect concurrent writes to the same stream
RailsEventStoreActiveRecord
-
Breaking: Uses two tables instead of one to save events and events in streams separately. Use following commands to migrate schema and data:
rails generate rails_event_store_active_record:v1_v2_migration rake db:migrateThis migration is intended to be run in offline mode. You need to edit this migration file and fill out the
def preserve_positions?(stream_name)method based on the instructions you will find there.If by any chance you cannot migrate the schema right now you can (for some limited) time switch to old repository, available as
RailsEventStoreActiveRecord::LegacyEventRepository:Rails.application.configure do config.to_prepare do Rails.configuration.event_store = RailsEventStore::Client.new( repository: RailsEventStoreActiveRecord::LegacyEventRepository.new ) end end
Mind that we're going to eventually remove
RailsEventStoreActiveRecord::LegacyEventRepositoryin one of next major releases. -
Breaking: Passing UUID is no longer accepted as
expected_versionof previous event in a stream. Use integers as sequence numbers for that purpose. -
Breaking:
delete_streamno longer removes an events. The new behaviour is as follows:EventRepository#delete_streamwill unlink events from given stream, leave it in othersLegacyEventRepository#delete_streamwill move events from given stream to global stream namedall
-
Change: 3 ways of providing
expected_version. Read more at our expected_version option explained article in the documentation -
Change: Properly detects race conditions in case of concurrent writes to the same stream using optimistic locking strategy when a proper
expected_versionis used. Read more at our expected_version option explained article in the documentation -
Change:
append_to_stream(events, stream_name, expected_version)API instead ofcreate(event, stream_name)which allows storing a collection of events transactionally and optimistic locking -
Add:
LegacyEventRepositoryto support old database schema and allow to prepare for migration to new schema used byEventRepository. -
Breaking:
RailsEventStoreActiveRecord::EventRepositorycannot be initialized with anadapter. -
Add:
RailsEventStoreActiveRecord::EventRepositorycan append the same event to multiple streams without the need to duplicate the event with a different UUID.
AggregateRoot
- Change: Properly provides lower layer with
expected_versionto detect concurrent writes to the same stream. Can raiseRubyEventStore::EventDuplicatedInStream(aliased asRailsEventStore::EventDuplicatedInStream) when there is a concurrency conflict. - Change:
unpublished_eventsis publicly available, read-only iterator.
RailsEventStore::RSpec
- no changes
BoundedContext
- no changes