import { NotFoundError } from '@task-stream/api/shared/domain'; import { FindIssuesRepository } from '../ports/find-issues.repository'; import { IQueryHandler, QueryHandler } from '@nestjs/cqrs'; import { ActivityReadModel } from '@task-stream/api/tracker/domain'; import { FindActivityRepository } from '../ports/find-activity.repository'; import { ReadAccess } from './read-access'; import { GetActivityQuery } from './get-activity.query'; @QueryHandler(GetActivityQuery) export class GetActivityQueryHandler implements IQueryHandler { constructor( private readonly findActivity: FindActivityRepository, private readonly access: ReadAccess, private readonly findIssues: FindIssuesRepository, ) {} async execute(query: GetActivityQuery): Promise { // A ticket's history goes with the ticket; the project's feed is for // whoever sees the whole project (not a guest). if (query.issueId) { const issue = this.access.assertFound( await this.findIssues.findById(query.issueId), 'Issue', query.issueId, ); if (issue.projectId !== query.projectId) throw new NotFoundError('Issue', query.issueId); await this.access.assertCanViewIssue(issue, query.viewerId); } else await this.access.assertSeesWholeProject(query.projectId, query.viewerId); return this.findActivity.find({ projectId: query.projectId, issueId: query.issueId, limit: Math.min(query.limit, 200), before: query.before, after: query.after, }); } }