A social knowledge tool for researchers built on ATProto
1import { Entity } from './Entity';
2import { IDomainEvent } from './events/IDomainEvent';
3import { UniqueEntityID } from './UniqueEntityID';
4
5export abstract class AggregateRoot<T> extends Entity<T> {
6 private _domainEvents: IDomainEvent[] = [];
7
8 get id(): UniqueEntityID {
9 return this._id;
10 }
11
12 get domainEvents(): IDomainEvent[] {
13 return this._domainEvents;
14 }
15
16 protected addDomainEvent(domainEvent: IDomainEvent): void {
17 this._domainEvents.push(domainEvent);
18 this.logDomainEventAdded(domainEvent);
19 }
20
21 public clearEvents(): void {
22 this._domainEvents.splice(0, this._domainEvents.length);
23 }
24
25 private logDomainEventAdded(domainEvent: IDomainEvent): void {
26 const thisClass = Reflect.getPrototypeOf(this);
27 const domainEventClass = Reflect.getPrototypeOf(domainEvent);
28 console.info(
29 `[Domain Event Created]:`,
30 thisClass?.constructor.name,
31 '==>',
32 domainEventClass?.constructor.name,
33 );
34 }
35}