import { guestOnly } from './read-access'; import { IQueryHandler, QueryHandler } from '@nestjs/cqrs'; import { ReleaseReadModel } from '@task-stream/api/tracker/domain'; import { FindProjectsRepository } from '../ports/find-projects.repository'; import { FindReleasesRepository } from '../ports/find-releases.repository'; import { GetUpcomingReleasesQuery } from './get-upcoming-releases.query'; @QueryHandler(GetUpcomingReleasesQuery) export class GetUpcomingReleasesQueryHandler implements IQueryHandler { constructor( private readonly findProjects: FindProjectsRepository, private readonly findReleases: FindReleasesRepository, ) {} async execute(query: GetUpcomingReleasesQuery): Promise { const projects = await this.findProjects.findByMember(query.viewerId); // A guest does not see a private project's releases. return this.findReleases.findUpcoming( projects .filter((project) => !guestOnly(project, query.viewerId)) .map((project) => project.id), Math.min(query.limit, 50), ); } }