import { EventsHandler, IEventHandler } from '@nestjs/cqrs'; import { IssueAssignedEvent } from '@task-stream/api/tracker/domain'; import { UpsertMaterializedIssueRepository } from '../ports/upsert-materialized-issue.repository'; import { UserDirectory } from '../ports/user-directory'; import { ReadModelNotifier, versionOf } from './read-model-notifier'; @EventsHandler(IssueAssignedEvent) export class IssueAssignedEventHandler implements IEventHandler { constructor( private readonly upsertMaterializedIssueRepository: UpsertMaterializedIssueRepository, private readonly users: UserDirectory, private readonly notifier: ReadModelNotifier, ) {} async handle(event: IssueAssignedEvent) { const users = await this.users.refs([event.assigneeId]); await this.upsertMaterializedIssueRepository.upsert({ id: event.aggregateId, assignee: users.ofNullable(event.assigneeId), updatedAt: event.occurredAt, version: versionOf(event), }); await this.notifier.issue(event.aggregateId, event); } }