@@ -121,6 +121,12 @@ func (a *AggregateBase) RegisterEventListener(eventType string, eventHandler eve
121121 return a
122122}
123123
124+ type EventTypeInvalidError string
125+
126+ func (e EventTypeInvalidError ) Error () string {
127+ return fmt .Sprintf ("event type '%s' is invalid" , string (e ))
128+ }
129+
124130// HandleEvent finds and calls the registered event handler
125131// based on the type of the passed event.
126132// The executed event handler can modify the in-memory data of the aggregate.
@@ -133,7 +139,7 @@ func (a *AggregateBase) HandleEvent(event Event) error {
133139
134140 eventHandler , found := a .eventHandlers [event .EventType ]
135141 if ! found {
136- return fmt . Errorf ( "event type '%s' is invalid" , event .EventType )
142+ return EventTypeInvalidError ( event .EventType )
137143 }
138144
139145 if err := eventHandler (event ); err != nil {
@@ -155,13 +161,27 @@ func (a *AggregateBase) ClearUncommittedEvents() {
155161 a .uncommittedEvents = make ([]Event , 0 )
156162}
157163
164+ type EventAggregateMismatchError struct {
165+ Targeted uuid.UUID
166+ Got uuid.UUID
167+ }
168+
169+ func (e EventAggregateMismatchError ) Error () string {
170+ return fmt .Sprintf ("event applied to aggregate %q but was targeted at aggregate %q" ,
171+ e .Got .String (), e .Targeted .String ())
172+ }
173+
174+ var ErrLoadDeletedAggregate = errors .New ("AggregateBase.Load: aggregate has been marked as deleted" )
175+
158176// Load applies events to an aggregate by utilizing the registered event listeners
159177// Currently not in use. Could be helpful for testing.
160178func (a * AggregateBase ) Load (events []Event ) error {
161179 for _ , event := range events {
162180 if event .GetAggregateID () != a .GetID () {
163- return fmt .Errorf ("event applied to aggregate '%s' but was targeted at aggregate '%s'" ,
164- a .GetID (), event .GetAggregateID ())
181+ return fmt .Errorf ("AggregateBase.Load: %w" , EventAggregateMismatchError {
182+ Targeted : a .GetID (),
183+ Got : event .GetAggregateID (),
184+ })
165185 }
166186
167187 if err := a .HandleEvent (event ); err != nil {
@@ -172,7 +192,7 @@ func (a *AggregateBase) Load(events []Event) error {
172192 a .version ++
173193 }
174194 if a .IsDeleted () {
175- return errors . New ("AggregateBase.Load: aggregate has been marked as deleted" )
195+ return fmt . Errorf ("AggregateBase.Load: %w" , ErrLoadDeletedAggregate )
176196 }
177197
178198 return nil
@@ -183,8 +203,10 @@ func (a *AggregateBase) Load(events []Event) error {
183203// Apply -> You apply a *new* event to the aggregate that could be persisted
184204func (a * AggregateBase ) Apply (event Event ) error {
185205 if event .GetAggregateID () != a .GetID () {
186- return fmt .Errorf ("event applied to aggregate '%s' but was targeted at aggregate '%s'" ,
187- a .GetID (), event .GetAggregateID ())
206+ return fmt .Errorf ("AggregateBase.Apply: %w" , EventAggregateMismatchError {
207+ Targeted : a .GetID (),
208+ Got : event .GetAggregateID (),
209+ })
188210 }
189211
190212 if err := a .HandleEvent (event ); err != nil {
@@ -197,18 +219,29 @@ func (a *AggregateBase) Apply(event Event) error {
197219 return nil
198220}
199221
222+ type EventOutOfDateError struct {
223+ AggregateVersion uint64
224+ EventVersion uint64
225+ }
226+
227+ func (e EventOutOfDateError ) Error () string {
228+ return fmt .Sprintf ("event version (%d) is lower than aggregate version (%d)" ,
229+ e .EventVersion , e .AggregateVersion )
230+ }
231+
200232// Progress should be called after all events are loaded though an aggregate store.
201233// The passed event gets applied to an aggregate by utilizing the registered event listeners.
202234// Progress -> You progress the state of an aggregate
203235func (a * AggregateBase ) Progress (event Event ) error {
204236 if event .GetAggregateID () != a .GetID () {
205- return fmt .Errorf ("event applied to aggregate '%s' but was targeted at aggregate '%s'" ,
206- a .GetID (), event .GetAggregateID ())
237+ return fmt .Errorf ("AggregateBase.Progress: %w" , EventAggregateMismatchError {
238+ Targeted : a .GetID (),
239+ Got : event .GetAggregateID (),
240+ })
207241 }
208242
209243 if event .GetVersion () < a .GetVersion () {
210- return fmt .Errorf ("event version of %d is lower then aggregate version of %d" ,
211- event .GetVersion (), a .GetVersion ())
244+ return EventOutOfDateError {EventVersion : event .GetVersion (), AggregateVersion : a .GetVersion ()}
212245 }
213246
214247 if err := a .HandleEvent (event ); err != nil {
0 commit comments