Skip to content

Guards y Decoradores

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"
}

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;
}

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) { ... }

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.

Middleware que inyecta request.organizationId en todas las requests de usuarios CORPORATE_*. Todos los queries corporativos deben filtrar por este campo.

Ver multi-tenancy en control de acceso.