-
Notifications
You must be signed in to change notification settings - Fork 2
es cqrs.Class.Aggregate
@sclable/nestjs-libs / es-cqrs / Aggregate
Aggregate class that has an id and a revision number
Use the EventSourcableAggregate decorator so that the ES-CQRS module can register possible events. EventRegistry.
Implement event handlers inside with the name on${EventClassName}
to change the aggregates upon events.
Creation events should get a revision of 1
. Modifier events should get an incremented value from the aggregate's
current revision. To make this easier call this.uppedRevision()
for both.
Example:
import { Aggregate, Event } from '@sclable/es-cqrs'
import { AccountCreatedEvent, AccountNameChangedEvent } from './events'
import { v4 as uuidv4 } from 'uuid'
@EventSourcableAggregate(AccountCreatedEvent, AccountNameChangedEvent)
export class AccountAggregate extends Aggregate {
accountName: string
public static create(id: string, userId: string) {
const self = new AccountAggregate(id, userId)
self.apply(new AccountCreatedEvent(id, self.uppedRevision()))
return self
}
public changeName(accountName: string) {
this.apply(new AccountNameChangedEvent(this.id, this.uppedRevision(), {accountName}))
}
public onAccountCreatedEvent(event: AccountCreatedEvent) {
this.accountName = 'default'
}
public onAccountNameChangedEvent(event: AccountNameChangedEvent) {
this.accountName = event.data.name
}
}
-
AggregateRoot
<Event
>
EventSourcedAggregate
new Aggregate(
id
,userId
):Aggregate
• id: string
• userId: string
AggregateRoot<Event>.constructor
packages/es-cqrs/src/aggregate.ts:51
readonly
id:string
EventSourcedAggregate.id
packages/es-cqrs/src/aggregate.ts:51
revision:
number
=0
EventSourcedAggregate.revision
packages/es-cqrs/src/aggregate.ts:49
readonly
userId:string
EventSourcedAggregate.userId
packages/es-cqrs/src/aggregate.ts:51
apply(
event
,options
):void
Applies an event. If auto commit is enabled, the event will be published immediately (note: must be merged with the publisher context in order to work). Otherwise, the event will be stored in the internal events array, and will be published when the commit method is called. Also, the corresponding event handler will be called (if exists). For example, if the event is called UserCreatedEvent, the "onUserCreatedEvent" method will be called.
• event: Event
The event to apply.
• options: boolean
| object
= false
void
AggregateRoot.apply
packages/es-cqrs/src/aggregate.ts:59
protected
applyEvent<T
>(event
,data
):void
Apply event helper
Takes care of upping the revision and saving the user ID
• T
event data type
• event: EventConstructor
event class
• data: T
event data
void
packages/es-cqrs/src/aggregate.ts:83
getUncommittedEvents():
Event
[]
Returns all uncommitted events.
Event
[]
All uncommitted events.
AggregateRoot.getUncommittedEvents
packages/es-cqrs/src/aggregate.ts:55
uppedRevision():
number
number
an incremented revision for events