workspace-v1/shared/libs/auth/_reference/jwt-auth.guard.reference.ts
rckrdmrd 66161b1566 feat: Workspace-v1 complete migration with NEXUS v3.4
Sistema NEXUS v3.4 migrado con:

Estructura principal:
- core/orchestration: Sistema SIMCO + CAPVED (27 directivas, 28 perfiles)
- core/catalog: Catalogo de funcionalidades reutilizables
- shared/knowledge-base: Base de conocimiento compartida
- devtools/scripts: Herramientas de desarrollo
- control-plane/registries: Control de servicios y CI/CD
- orchestration/: Configuracion de orquestacion de agentes

Proyectos incluidos (11):
- gamilit (submodule -> GitHub)
- trading-platform (OrbiquanTIA)
- erp-suite con 5 verticales:
  - erp-core, construccion, vidrio-templado
  - mecanicas-diesel, retail, clinicas
- betting-analytics
- inmobiliaria-analytics
- platform_marketing_content
- pos-micro, erp-basico

Configuracion:
- .gitignore completo para Node.js/Python/Docker
- gamilit como submodule (git@github.com:rckrdmrd/gamilit-workspace.git)
- Sistema de puertos estandarizado (3005-3199)

Generated with NEXUS v3.4 Migration System
EPIC-010: Configuracion Git y Repositorios
2026-01-04 03:37:42 -06:00

91 lines
2.3 KiB
TypeScript

/**
* JWT AUTH GUARD - REFERENCE IMPLEMENTATION
*
* @description Guard de autenticación JWT para proteger rutas.
* Activa la estrategia JWT y maneja errores de autenticación.
*
* @usage
* ```typescript
* @Get('protected')
* @UseGuards(JwtAuthGuard)
* getProtectedData(@Request() req) {
* return req.user;
* }
* ```
*
* @origin gamilit/apps/backend/src/modules/auth/guards/jwt-auth.guard.ts
*/
import { Injectable, ExecutionContext, UnauthorizedException } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { Reflector } from '@nestjs/core';
/**
* Metadata key para rutas públicas
*/
export const IS_PUBLIC_KEY = 'isPublic';
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
constructor(private readonly reflector: Reflector) {
super();
}
/**
* Determinar si la ruta requiere autenticación
*
* @description Verifica el decorador @Public() antes de activar el guard.
* Si la ruta es pública, permite el acceso sin token.
*/
canActivate(context: ExecutionContext) {
// Verificar si la ruta tiene @Public()
const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
context.getHandler(),
context.getClass(),
]);
if (isPublic) {
return true;
}
// Activar validación JWT normal
return super.canActivate(context);
}
/**
* Manejar resultado de autenticación
*
* @description Personaliza el mensaje de error cuando falla la autenticación.
*/
handleRequest(err: Error | null, user: any, info: Error | null) {
if (err || !user) {
if (info?.message === 'jwt expired') {
throw new UnauthorizedException('Token expirado');
}
if (info?.message === 'No auth token') {
throw new UnauthorizedException('Token no proporcionado');
}
throw new UnauthorizedException('No autorizado');
}
return user;
}
}
// ============ DECORADOR PUBLIC ============
import { SetMetadata } from '@nestjs/common';
/**
* Decorador para marcar rutas como públicas
*
* @usage
* ```typescript
* @Public()
* @Get('health')
* healthCheck() {
* return { status: 'ok' };
* }
* ```
*/
export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);