import { EventsHandler, IEventHandler } from '@nestjs/cqrs'; import { defaultProjectSettings, ProjectCreatedEvent, } from '@task-stream/api/tracker/domain'; import { UpsertMaterializedProjectRepository } from '../ports/upsert-materialized-project.repository'; import { UserDirectory } from '../ports/user-directory'; import { ReadModelNotifier, versionOf } from './read-model-notifier'; @EventsHandler(ProjectCreatedEvent) export class ProjectCreatedEventHandler implements IEventHandler { constructor( private readonly upsertMaterializedProjectRepository: UpsertMaterializedProjectRepository, private readonly users: UserDirectory, private readonly notifier: ReadModelNotifier, ) {} async handle(event: ProjectCreatedEvent) { const { project } = event; const users = await this.users.refs(project.members.map((m) => m.userId)); await this.upsertMaterializedProjectRepository.upsert({ id: project.id, key: project.key, name: project.name, description: project.description, owner: users.of(project.ownerId), members: project.members.map((m) => ({ user: users.of(m.userId), role: m.role, })), // Projects created before settings existed get the defaults. settings: project.settings ?? defaultProjectSettings(), createdAt: project.createdAt, updatedAt: project.updatedAt, version: versionOf(event), }); await this.notifier.project(event, [project.ownerId]); } }