import { IQueryHandler, QueryHandler } from '@nestjs/cqrs'; import { IssueReadModel } from '@task-stream/api/tracker/domain'; import { FindIssuesRepository } from '../ports/find-issues.repository'; import { ReadAccess, UUID } from './read-access'; import { GetIssueQuery } from './get-issue.query'; @QueryHandler(GetIssueQuery) export class GetIssueQueryHandler implements IQueryHandler { constructor( private readonly findIssues: FindIssuesRepository, private readonly access: ReadAccess, ) {} async execute(query: GetIssueQuery): Promise { const issue = UUID.test(query.idOrKey) ? await this.findIssues.findById(query.idOrKey) : await this.findIssues.findByKey(query.idOrKey.toUpperCase()); const found = this.access.assertFound(issue, 'Issue', query.idOrKey); await this.access.assertCanViewIssue(found, query.viewerId, { entity: 'Issue', ref: query.idOrKey, }); return found; } }