A project member can be a GUEST. In a private project a guest only sees the tickets they take part in (opened, assigned or followed): every other ticket answers 404, also in my work, realtime changes, blockers and linked tickets, and project-wide views (activity, statistics, dashboard, releases, sprints, epics, trash) answer 403. Guests open tickets without assigning or planning them, and comment, attach, follow and vote on their own; they change nothing else. In a public project they see what anyone does. The web gives them only Tablero, Lista and Miembros and loads none of the project-wide data. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
28 lines
995 B
TypeScript
28 lines
995 B
TypeScript
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<GetIssueQuery, IssueReadModel>
|
|
{
|
|
constructor(
|
|
private readonly findIssues: FindIssuesRepository,
|
|
private readonly access: ReadAccess,
|
|
) {}
|
|
|
|
async execute(query: GetIssueQuery): Promise<IssueReadModel> {
|
|
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;
|
|
}
|
|
}
|