Esta página describe cómo se organizan y comunican las tres capas del sistema UZDI: el SPA de Vue 3, la API REST de NestJS y la base de datos PostgreSQL con schemas separados por dominio.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/Zapiony/PUCE_UZDI_2026/llms.txt
Use this file to discover all available pages before exploring further.
Resumen de la arquitectura
UZDI sigue una arquitectura de tres capas clara y desacoplada:- Frontend SPA — Vue 3 + Vite, corre en el navegador del usuario (
localhost:5174en desarrollo). - Backend REST API — NestJS, expone todos sus endpoints bajo el prefijo global
/api/v1(localhost:3000). - Base de datos relacional — PostgreSQL con 6 schemas funcionales, triggers de auditoría automáticos y sin migraciones automáticas (TypeORM en modo
synchronize: false).
Frontend architecture
Tooling y entry point
El frontend se inicializa enUZDI_FRONT/src/main.ts:
| Herramienta | Rol |
|---|---|
| Vite 8 | Bundler y servidor de desarrollo con HMR |
| Vue 3.5 Composition API | Framework reactivo con <script setup> |
| TypeScript 6 | Tipado estático en toda la codebase |
| vue-tsc | Verificación de tipos en tiempo de build |
Router — 9 rutas de aplicación
El router usacreateWebHistory() (HTML5 history API) y define 10 rutas totales: una de login pública y 9 vistas protegidas bajo el layout /app/*.
beforeEach guard verifica uzdi_token en localStorage y el tppr_id del usuario para controlar el acceso a rutas protegidas:
AppShell — Layout global
AppShell.vue es el componente raíz de todas las vistas autenticadas. Provee:
- Sidebar de 264px con navegación agrupada (General, Gestión, Análisis, Configuración) e íconos Lucide. Badges de conteo en tiempo real. Estado activo dinámico con gradiente azul y línea amarilla.
- Topbar con breadcrumb, zona UZDI del usuario y campana de notificaciones.
- Búsqueda global (
Ctrl+K): overlay con filtrado en tiempo real sobre adolescentes y expedientes cargados desde la API. - Responsive: el sidebar se colapsa en móvil; un botón hamburger en la topbar abre un overlay.
Services layer
Toda comunicación con el backend pasa por una instanciaaxios centralizada en src/services/api.ts que inyecta automáticamente el token JWT en cada petición:
| Servicio | Responsabilidad |
|---|---|
auth.service.ts | Login y cambio de contraseña |
adolescente.service.ts | CRUD /api/v1/adolescentes |
expediente.service.ts | CRUD /api/v1/expedientes |
medida.service.ts | CRUD /api/v1/medidas-socioeducativas |
usuario.service.ts | CRUD /api/v1/users |
uzdi.service.ts | GET/PATCH /api/v1/uzdi/:id |
catalogo.service.ts | Catálogos de referencia (etnias, UZDIs, etc.) |
Composables
| Composable | Descripción |
|---|---|
useAuth | Estado global de sesión: token, datos del usuario (tppr_id, nombre, UZDI), logout |
useCatalogos | Carga perezosa (lazy) de catálogos de referencia compartidos entre formularios |
Backend architecture
Bootstrap y configuración global
El archivoUZDI_BACK/src/main.ts configura toda la aplicación antes de escuchar peticiones:
Módulos de dominio
Global pipes — flujo de validación y sanitización
Cada petición entrante con un cuerpo JSON atraviesa dos pipes globales en cascada:El orden de registro importa:
SanitizationPipe se registra primero para que los strings ya estén limpios cuando ValidationPipe los transforma a instancias de DTO.TypeORM configuration
TypeORM se configura enAppModule con las siguientes opciones clave:
synchronize: false es intencional. La estructura de la base de datos se controla exclusivamente a través del script DDL_UZDI_FINAL.sql. Esto garantiza que los schemas, triggers y constraints definidos en el DDL no sean sobreescritos por TypeORM.Database architecture
Schemas de PostgreSQL
La base de datosuzdi_db está organizada en 6 schemas funcionales, cada uno correspondiente a un dominio del sistema:
| Schema | Descripción | Tablas principales |
|---|---|---|
estructura_institucional | Jerarquía geográfica e institucional | uzdi, provincia, canton |
seguridad | Usuarios, roles, permisos y auditoría | persona, perfil, permiso, accion, sesion, historial |
adolescente | Datos del adolescente y su proceso | adolescente, expediente, medida_socioeducativa, infraccion, etnia, estado_civil, nacionalidad |
contexto_familiar | Entorno familiar y representantes | representante, tipo_parentesco, adolescente_representante |
talleres_actividades | Talleres formativos y asistencia | taller, asistencia_taller |
gestion_documental | Documentos adjuntos a expedientes | documento_expediente, tipo_documento |
Trigger de auditoría — seguridad.fn_registrar_historial
Cada operación de escritura en cualquier tabla del sistema queda registrada automáticamente en seguridad.historial:
Trigger de última modificación — seguridad.fn_actualizar_fcmod
Un segundo trigger de base de datos actualiza automáticamente la columna fcMod (fecha de modificación) en cada fila que es modificada mediante UPDATE:
updatedAt desde la aplicación; la base de datos lo garantiza a nivel de trigger.
Security architecture
RBAC — Control de acceso basado en roles
El backend implementa RBAC mediante dos piezas del módulocommon:
RolesGuard: un guard de NestJS que inspecciona eltppr_iddel usuario autenticado y lo compara con los roles requeridos declarados en el decorador.@Roles()decorator: decorador de metadata que se aplica en controladores o handlers individuales para indicar qué roles pueden acceder.
MockAuthMiddleware (desarrollo)
Durante el desarrollo,MockAuthMiddleware inyecta un usuario simulado en el request para poder trabajar sin un token JWT real. Este middleware debe deshabilitarse en producción.
Hashing de contraseñas
Todas las contraseñas se almacenan como hashes bcrypt. El móduloauth nunca guarda ni compara contraseñas en texto plano:
bcrypt versión 6.x incluye salt automático con factor de costo configurable. El sistema usa el valor por defecto de 10 rondas, que ofrece un balance adecuado entre seguridad y rendimiento para el volumen de usuarios esperado.