import { IQueryHandler, QueryHandler } from '@nestjs/cqrs'; import { IssueReadModel } from '@task-stream/api/tracker/domain'; import { FindIssuesRepository } from '../ports/find-issues.repository'; import { ReadAccess } from './read-access'; import { GetIssuesByIdsQuery } from './get-issues-by-ids.query'; @QueryHandler(GetIssuesByIdsQuery) export class GetIssuesByIdsQueryHandler implements IQueryHandler { constructor( private readonly findIssues: FindIssuesRepository, private readonly access: ReadAccess, ) {} async execute(query: GetIssuesByIdsQuery): Promise { const issues = await this.findIssues.findByIds([...new Set(query.ids)]); // Linked tickets may sit in other projects: keep the ones the viewer can read. const visible = new Map(); for (const projectId of new Set(issues.map((issue) => issue.projectId))) { visible.set( projectId, await this.access.canView(projectId, query.viewerId), ); } return issues.filter((issue) => visible.get(issue.projectId)); } }