import { IQueryHandler, QueryHandler } from '@nestjs/cqrs'; import { NotFoundError } from '@task-stream/api/shared/domain'; import { AttachmentStorage, attachmentKey } from '../ports/attachment-storage'; import { FindIssuesRepository } from '../ports/find-issues.repository'; import { AttachmentDownload, GetAttachmentQuery } from './get-attachment.query'; import { ReadAccess } from './read-access'; @QueryHandler(GetAttachmentQuery) export class GetAttachmentQueryHandler implements IQueryHandler { constructor( private readonly findIssues: FindIssuesRepository, private readonly storage: AttachmentStorage, private readonly access: ReadAccess, ) {} async execute(query: GetAttachmentQuery): Promise { const issue = this.access.assertFound( await this.findIssues.findById(query.issueId), 'Attachment', query.attachmentId, ); await this.access.assertCanView(issue.projectId, query.viewerId, { entity: 'Attachment', ref: query.attachmentId, }); const attachment = (issue.attachments ?? []).find( (a) => a.id === query.attachmentId, ); if (!attachment) throw new NotFoundError('Attachment', query.attachmentId); return { attachment, content: await this.storage.read( attachmentKey(issue.projectId, issue.id, attachment.id), ), }; } }