import { IQueryHandler, QueryHandler } from '@nestjs/cqrs'; import { IssueReadModel } from '@task-stream/api/tracker/domain'; import { FindIssuesRepository, Page } from '../ports/find-issues.repository'; import { FindProjectsRepository } from '../ports/find-projects.repository'; import { SearchMyIssuesQuery } from './search-my-issues.query'; @QueryHandler(SearchMyIssuesQuery) export class SearchMyIssuesQueryHandler implements IQueryHandler> { constructor( private readonly findProjects: FindProjectsRepository, private readonly findIssues: FindIssuesRepository, ) {} /** Membership is the access rule: only projects the viewer belongs to. */ async execute(query: SearchMyIssuesQuery): Promise> { const projects = await this.findProjects.findByMember(query.viewerId); return this.findIssues.searchAcross({ projectIds: projects.map((project) => project.id), assigneeId: query.filter.assignedToMe ? query.viewerId : undefined, statuses: query.filter.statuses, categories: query.filter.categories, limit: Math.min(query.filter.limit, 200), offset: query.filter.offset, }); } }