From 4b6895dec63fbacb91073b060e4dd4de8e76ca66 Mon Sep 17 00:00:00 2001 From: ellecio2 Date: Tue, 17 Mar 2026 12:11:27 -0400 Subject: [PATCH] =?UTF-8?q?Agregar=20decorador=20@Public()=20para=20endpoi?= =?UTF-8?q?nts=20p=C3=BAblicos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Crear public.decorator.ts con IS_PUBLIC_KEY - Modificar JwtAuthGuard para verificar @Public() y saltar auth - Marcar GET /tourism/guides como público Co-Authored-By: Claude Opus 4.5 --- src/common/decorators/public.decorator.ts | 4 ++++ src/common/guards/jwt-auth.guard.ts | 23 +++++++++++++++++++++-- src/modules/tourism/tourism.controller.ts | 2 ++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 src/common/decorators/public.decorator.ts diff --git a/src/common/decorators/public.decorator.ts b/src/common/decorators/public.decorator.ts new file mode 100644 index 0000000..b3845e1 --- /dev/null +++ b/src/common/decorators/public.decorator.ts @@ -0,0 +1,4 @@ +import { SetMetadata } from '@nestjs/common'; + +export const IS_PUBLIC_KEY = 'isPublic'; +export const Public = () => SetMetadata(IS_PUBLIC_KEY, true); diff --git a/src/common/guards/jwt-auth.guard.ts b/src/common/guards/jwt-auth.guard.ts index 2155290..0604d1a 100755 --- a/src/common/guards/jwt-auth.guard.ts +++ b/src/common/guards/jwt-auth.guard.ts @@ -1,5 +1,24 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, ExecutionContext } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; +import { IS_PUBLIC_KEY } from '../decorators/public.decorator'; @Injectable() -export class JwtAuthGuard extends AuthGuard('jwt') {} +export class JwtAuthGuard extends AuthGuard('jwt') { + constructor(private reflector: Reflector) { + super(); + } + + canActivate(context: ExecutionContext) { + const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ + context.getHandler(), + context.getClass(), + ]); + + if (isPublic) { + return true; + } + + return super.canActivate(context); + } +} diff --git a/src/modules/tourism/tourism.controller.ts b/src/modules/tourism/tourism.controller.ts index 08bbd69..a7ec466 100755 --- a/src/modules/tourism/tourism.controller.ts +++ b/src/modules/tourism/tourism.controller.ts @@ -12,6 +12,7 @@ import { UpdatePlaceDto } from './dto/update-place.dto'; import { CreateTourGuideDto } from './dto/create-tour-guide.dto'; import { UpdateTourGuideDto } from './dto/update-tour-guide.dto'; import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard'; +import { Public } from '../../common/decorators/public.decorator'; import { RolesGuard } from '../../common/guards/roles.guard'; import { Roles } from '../../common/decorators/roles.decorator'; import { Destination } from '../../entities/destination.entity'; @@ -154,6 +155,7 @@ export class TourismController { return this.tourismService.createTourGuide(createTourGuideDto); } + @Public() @Get('guides') @ApiOperation({ summary: 'Get all tour guides with filters' }) @ApiQuery({ name: 'page', required: false, type: Number })