A social knowledge tool for researchers built on ATProto
1import { IEventPublisher } from '../application/events/IEventPublisher'; 2import { AggregateRoot } from '../domain/AggregateRoot'; 3import { Result, ok } from './Result'; 4 5export interface UseCase<IRequest, IResponse> { 6 execute(request?: IRequest): Promise<IResponse> | IResponse; 7} 8 9export abstract class BaseUseCase<IRequest, IResponse> 10 implements UseCase<IRequest, IResponse> 11{ 12 constructor(protected eventPublisher: IEventPublisher) {} 13 14 abstract execute(request?: IRequest): Promise<IResponse> | IResponse; 15 16 protected async publishEventsForAggregate( 17 aggregate: AggregateRoot<any>, 18 ): Promise<Result<void>> { 19 const events = aggregate.domainEvents; 20 21 if (events.length === 0) { 22 return ok(undefined); 23 } 24 25 const publishResult = await this.eventPublisher.publishEvents(events); 26 27 if (publishResult.isOk()) { 28 aggregate.clearEvents(); 29 } 30 31 return publishResult; 32 } 33}