From 8dcead3461a78efe36e4be3e5a332719aafb4477 Mon Sep 17 00:00:00 2001 From: Fernando Almeida Date: Sat, 1 Aug 2026 17:33:32 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20libera=20endpoints=20de=20aluno=20gated?= =?UTF-8?q?=20por=20permiss=C3=A3o=20de=20colaborador?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Três endpoints consumidos por alunos exigiam permissões de colaborador (visualizarDemanda / visualizarQuestao / revisarRedacoes), resultando em 403 para alunos legítimos. Passam a exigir apenas autenticação: - GET /materia: listagem de matérias (página de estudo) - GET /questao/:id/image: imagem de questão durante o simulado - GET /essay/:id: aluno vê a própria redação (findById filtra por dono; revisor/admin seguem autorizados via validateReviewerScope no service) Co-Authored-By: Claude Opus 4.8 --- src/modules/essay/essay.controller.ts | 5 +++-- src/modules/simulado/materia/materia.controller.ts | 5 +++-- src/modules/simulado/questao/questao.controller.ts | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/modules/essay/essay.controller.ts b/src/modules/essay/essay.controller.ts index c7fa8f8..1c482e4 100644 --- a/src/modules/essay/essay.controller.ts +++ b/src/modules/essay/essay.controller.ts @@ -275,8 +275,9 @@ export class EssayController { } @Get(':id') - @UseGuards(JwtAuthGuard, PermissionsGuard) - @SetMetadata(PermissionsGuard.name, Permissions.revisarRedacoes) + // Aluno visualiza a própria redação (findById filtra por dono); + // revisor/admin são autorizados por validateReviewerScope no service + @UseGuards(JwtAuthGuard) async getEssay(@Param('id') id: string, @Req() req: any) { try { return await this.essayService.findById(id, req.user.id); diff --git a/src/modules/simulado/materia/materia.controller.ts b/src/modules/simulado/materia/materia.controller.ts index 65de0cc..12e5f34 100644 --- a/src/modules/simulado/materia/materia.controller.ts +++ b/src/modules/simulado/materia/materia.controller.ts @@ -13,6 +13,7 @@ import { import { ApiTags } from '@nestjs/swagger'; import { Permissions } from 'src/modules/role/permissions/permissions'; import { GetAllDtoInput } from 'src/shared/dtos/get-all.dto.input'; +import { JwtAuthGuard } from 'src/shared/guards/jwt-auth.guard'; import { PermissionsGuard } from 'src/shared/guards/permission.guard'; import { MateriaProxyService } from './materia.service'; @@ -29,8 +30,8 @@ export class MateriaProxyController { } @Get() - @UseGuards(PermissionsGuard) - @SetMetadata(PermissionsGuard.name, Permissions.visualizarDemanda) + // Listagem de matérias consumida por alunos na página de estudo: exige apenas autenticação + @UseGuards(JwtAuthGuard) async getAll(@Query() query: GetAllDtoInput) { return await this.materiaService.getAll(query.page, query.limit); } diff --git a/src/modules/simulado/questao/questao.controller.ts b/src/modules/simulado/questao/questao.controller.ts index 8b9c2af..e7332e5 100644 --- a/src/modules/simulado/questao/questao.controller.ts +++ b/src/modules/simulado/questao/questao.controller.ts @@ -18,6 +18,7 @@ import { ApiBearerAuth, ApiResponse, ApiTags } from '@nestjs/swagger'; import { Request } from 'express'; import { Permissions } from 'src/modules/role/permissions/permissions'; import { User } from 'src/modules/user/user.entity'; +import { JwtAuthGuard } from 'src/shared/guards/jwt-auth.guard'; import { PermissionsGuard } from 'src/shared/guards/permission.guard'; import { QuestaoDTOInput } from '../dtos/questao.dto.input'; import { UpdateImageAlternativaDTOInput } from '../dtos/update-image-alternativa.dto.input'; @@ -245,8 +246,8 @@ export class QuestaoController { status: 200, description: 'busca imagem de questão', }) - @UseGuards(PermissionsGuard) - @SetMetadata(PermissionsGuard.name, Permissions.visualizarQuestao) + // Recurso consumido por alunos durante o simulado: exige apenas autenticação + @UseGuards(JwtAuthGuard) public async getImage(@Param('id') id: string) { return await this.questaoService.getImage(id); }