import { IQueryHandler, QueryHandler } from '@nestjs/cqrs'; import { IssueReadModel } from '@task-stream/api/tracker/domain'; import { FindIssuesRepository, Page } from '../ports/find-issues.repository'; import { ReadAccess } from './read-access'; import { SearchIssuesQuery } from './search-issues.query'; @QueryHandler(SearchIssuesQuery) export class SearchIssuesQueryHandler implements IQueryHandler> { constructor( private readonly findIssues: FindIssuesRepository, private readonly access: ReadAccess, ) {} async execute(query: SearchIssuesQuery): Promise> { await this.access.assertCanView(query.filter.projectId, query.viewerId); const { watching, ...filter } = query.filter; // Someone anonymous follows nothing. if (watching && !query.viewerId) return { items: [], total: 0 }; return this.findIssues.search({ ...filter, participantId: (await this.access.participantScope( query.filter.projectId, query.viewerId, )) ?? undefined, watcherId: watching ? (query.viewerId ?? undefined) : undefined, limit: Math.min(query.filter.limit, 200), }); } }