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}