Files
basic-erp/apps/api/src/permissions/admin.guard.ts
T
GeorgeandClaude Sonnet 5.5 73fffee2f7 feat(api): permisos de menú en SQLite con API de administración
- SQLite (better-sqlite3 + TypeORM, WAL) con tabla menu_permissions
  (usuario web, patrón de ruta); archivo fuera del repo.
- GET /api/user/menu para el frontend; GET/PUT/DELETE /api/permissions
  solo para administradores (acceso "*").
- ADMIN_WEB_USERS garantiza el acceso total al arrancar; no se puede
  quitar el "*" al último administrador (409, dentro de una transacción).
- Patrones validados (`*`, `/modulo/ruta`, `/modulo/*`). A diferencia del
  frontend anterior, `/inventario/*` ya no habilita `/inventario-x`.
- Helper de e2e compartido (SAP simulado, SQLite en memoria).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-13 18:47:51 -05:00

18 lines
770 B
TypeScript

import { type CanActivate, type ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common';
import type { AuthenticatedRequest } from '../auth/auth.types.js';
import { PermissionsService } from './permissions.service.js';
/** Solo usuarios con acceso total ("*"). Se ejecuta después del guard de sesión global. */
@Injectable()
export class AdminGuard implements CanActivate {
constructor(private readonly permissions: PermissionsService) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const req = context.switchToHttp().getRequest<AuthenticatedRequest>();
if (!(await this.permissions.isAdmin(req.user.webUser))) {
throw new ForbiddenException('Requiere permisos de administrador');
}
return true;
}
}