import { IEventPublisher } from '../application/events/IEventPublisher'; import { AggregateRoot } from '../domain/AggregateRoot'; import { Result, ok } from './Result'; export interface UseCase { execute(request?: IRequest): Promise | IResponse; } export abstract class BaseUseCase implements UseCase { constructor(protected eventPublisher: IEventPublisher) {} abstract execute(request?: IRequest): Promise | IResponse; protected async publishEventsForAggregate( aggregate: AggregateRoot, ): Promise> { const events = aggregate.domainEvents; if (events.length === 0) { return ok(undefined); } const publishResult = await this.eventPublisher.publishEvents(events); if (publishResult.isOk()) { aggregate.clearEvents(); } return publishResult; } }