Guards y Decoradores
AccessLevelGuard
Section titled “AccessLevelGuard”Archivo: apps/api/src/common/guards/access-level.guard.ts
El guard más crítico del sistema. Compara el UserRole del JWT con el AccessLevel requerido por el endpoint.
@Get(':id')@RequireAccessLevel(AccessLevel.PAID_PRO) // ← Decorador custom@UseGuards(JwtAuthGuard, AccessLevelGuard)async getLesson(@Param('id') id: string, @CurrentUser() user: JwtUser) { return this.coursesService.getLesson(id, user.id);}Respuesta 403 en acceso denegado:
{ "statusCode": 403, "code": "INSUFFICIENT_ACCESS_LEVEL", "requiredLevel": "PAID_PRO", "userLevel": "FREE"}JwtAuthGuard
Section titled “JwtAuthGuard”Basado en @nestjs/passport. Valida el JWT Bearer token y popula request.user con:
interface JwtUser { sub: string; // userId email: string; role: UserRole; organizationId?: string;}RolesGuard + @Roles()
Section titled “RolesGuard + @Roles()”Para restricciones funcionales por rol (no por nivel de contenido):
@Delete(':id')@Roles(UserRole.SUPER_ADMIN, UserRole.CONTENT_ADMIN)@UseGuards(JwtAuthGuard, RolesGuard)async deleteUser(@Param('id') id: string) { ... }InternalGuard
Section titled “InternalGuard”Protege los endpoints /internal/* que solo llama apps/ai-backend:
@Get('ai-credentials/:provider')@UseGuards(InternalGuard)async getCredential(@Param('provider') provider: string) { ... }Valida el header x-internal-key contra AIBACKEND_API_KEY.
OrgTenantMiddleware
Section titled “OrgTenantMiddleware”Middleware que inyecta request.organizationId en todas las requests de usuarios CORPORATE_*. Todos los queries corporativos deben filtrar por este campo.