import { DomainEvent } from './domain-event.base'; import { Entity } from './entity.base'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { LoggerPort } from '@libs/ports/logger.port'; import { RequestContextService } from '../../application/context/AppRequestContext'; export abstract class AggregateRoot extends Entity { private _domainEvents: DomainEvent[] = []; get domainEvents(): DomainEvent[] { return this._domainEvents; } protected addEvent(domainEvent: DomainEvent): void { this._domainEvents.push(domainEvent); } public clearEvents(): void { this._domainEvents = []; } public async publishEvents( logger: LoggerPort, eventEmitter: EventEmitter2, ): Promise { await Promise.all( this.domainEvents.map(async (event) => { logger.debug( `[${RequestContextService.getRequestId()}] "${ event.constructor.name }" event published for aggregate ${this.constructor.name} : ${ this.id }`, ); return eventEmitter.emitAsync(event.constructor.name, event); }), ); this.clearEvents(); } }