11 KiB
Arquitectura del Sistema - EMERGES TES
Arquitectura actual, componentes principales y entidades del dominio.
Última actualización: 2025-02-02
🏗️ Arquitectura General
Estructura del Proyecto
guia-tes/
├── src/ # Frontend (React + TypeScript)
├── backend/ # Backend (Express + PostgreSQL)
├── admin-panel/ # Panel de administración (React)
├── public/ # Assets estáticos, manual
├── docs/ # Documentación
└── scripts/ # Scripts de utilidad
Separación Frontend / Backend
- Frontend: Aplicación PWA independiente, funciona offline
- Backend: API REST para gestión de contenido (admin)
- Admin Panel: Interfaz de administración separada
🎯 Arquitectura Backend (Clean Architecture)
Estructura de Capas
backend/src/
├── domain/ # Domain Layer (NO depende de nadie)
│ ├── entities/ # Entidades de dominio
│ ├── value-objects/ # Value Objects
│ └── repositories/ # Interfaces de repositorios
├── application/ # Application Layer (depende de Domain)
│ └── services/ # Servicios de aplicación
├── infrastructure/ # Infrastructure Layer (depende de Domain + Application)
│ ├── repositories/ # Implementaciones de repositorios
│ ├── mappers/ # Mappers Domain ↔ Persistence
│ └── database/ # Configuración BD
├── presentation/ # Presentation Layer (depende de Application + Domain)
│ └── routes/ # Rutas Express (API endpoints)
├── shared/ # Código compartido
│ ├── schemas/ # Schemas Zod
│ └── errors/ # Errores personalizados
└── middleware/ # Middleware Express
Reglas de Dependencias
Domain Layer
↑
Application Layer
↑
Infrastructure Layer
↑
Presentation Layer
Regla: Las dependencias apuntan siempre hacia adentro (hacia el Dominio).
- ✅ Domain: NO depende de nadie
- ✅ Application: Solo depende de Domain
- ✅ Infrastructure: Depende de Domain y Application
- ✅ Presentation: Depende de Application y Domain
📦 Componentes Principales
1. Domain Layer
Entidades de Dominio
ContentItem (domain/entities/ContentItem.ts)
- Protocolos, guías, manuales, checklists
- Estados:
draft,in_review,approved,published,archived - Ciclo de vida: Validación médica (submit → approve/reject → publish)
Drug (domain/entities/Drug.ts)
- Fármacos con especificaciones técnicas
- Categorías: cardiovascular, respiratorio, neurológico, etc.
- Dosis adulto/pediátrica, vías de administración
GlossaryTerm (domain/entities/GlossaryTerm.ts)
- Términos médicos del glosario
- Categorías: pharmaceutical, anatomical, clinical, procedural
- Relaciones con otros términos
MediaResource (domain/entities/MediaResource.ts)
- Imágenes, vídeos, documentos
- Asociación a bloques/capítulos del manual
- Metadatos (título, descripción, alt text)
MedicalReview (domain/entities/MedicalReview.ts)
- Revisiones médicas de contenido
- Estados:
pending,approved,rejected - Comentarios y validación clínica
Value Objects
ContentStatus (domain/value-objects/ContentStatus.ts)
- Estados válidos y transiciones permitidas
- Métodos:
canTransitionTo(),fromString()
ContentPriority (domain/value-objects/ContentPriority.ts)
- Prioridades:
critica,alta,media,baja
Repository Interfaces
IContentRepository- Operaciones CRUD de contenidoIDrugRepository- Operaciones CRUD de fármacosIGlossaryRepository- Operaciones CRUD de glosarioIValidationRepository- Operaciones de validación médicaIMediaRepository- Operaciones CRUD de medios
2. Application Layer
Servicios de Aplicación
ContentService (application/services/ContentService.ts)
- Lógica de negocio para contenido
- Validaciones complejas (unicidad, dependencias)
- Orquestación de casos de uso
GlossaryService (application/services/GlossaryService.ts)
- Lógica de negocio para glosario
- Búsqueda y filtrado
- Validaciones de términos
ValidationService (application/services/ValidationService.ts)
- Workflow de validación médica
- Transiciones de estado usando
ContentStatus - Registro de auditoría
StatsService (application/services/StatsService.ts)
- Estadísticas de contenido, validación, medios
- Caché de estadísticas
DrugService (application/services/DrugService.ts)
- Lógica de negocio para fármacos
- Validaciones y búsqueda
3. Infrastructure Layer
Repositorios (Implementaciones)
ContentRepository- PostgreSQL para contenidoDrugRepository- PostgreSQL para fármacosGlossaryRepository- PostgreSQL para glosarioValidationRepository- PostgreSQL para validaciónMediaRepository- PostgreSQL para medios
Mappers
ContentItemMapper- Domain ↔ PersistenceDrugMapper- Domain ↔ PersistenceGlossaryTermMapper- Domain ↔ Persistence
Regla: Los mappers validan con Zod antes de convertir a dominio.
4. Presentation Layer
Rutas API (presentation/routes/)
content.ts- CRUD de contenido (/api/content/*)drugs.ts- CRUD de fármacos (/api/drugs/*)glossary.ts- CRUD de glosario (/api/glossary/*)validation.ts- Validación médica (/api/validation/*)media.ts- Gestión de medios (/api/media/*)stats.ts- Estadísticas (/api/stats/*)
Middleware
auth.ts- Autenticación JWTvalidate.ts- Validación de requests con Zodrate-limit.ts- Rate limiting
🎨 Arquitectura Frontend
Estructura
src/
├── components/ # Componentes React
│ ├── content/ # Componentes de contenido
│ ├── drugs/ # Componentes de fármacos
│ ├── guide/ # Componentes de guías
│ ├── interactive/ # Componentes interactivos
│ └── ui/ # Componentes UI (shadcn/ui)
├── pages/ # Páginas/rutas
├── hooks/ # Hooks personalizados
├── services/ # Servicios (adaptadores, búsqueda)
├── data/ # Datos estáticos (protocolos, fármacos)
├── utils/ # Utilidades
└── types/ # Tipos TypeScript
Patrones
- Arquitectura funcional React (no Clean Architecture estricta)
- Componentes funcionales con hooks
- Datos estáticos embebidos (offline-first)
- Service Worker para caché agresivo
🗄️ Base de Datos
PostgreSQL
Esquema: tes_content
Tablas principales:
content_items- Protocolos, guías, manualesdrugs- Fármacosglossary_terms- Términos del glosariomedia_resources- Medios audiovisualesaudit_logs- Logs de auditoríausers- Usuarios (admin)content_versions- Versiones de contenidocontent_resource_associations- Asociaciones contenido-medios
Migraciones: backend/database/migrations/
🔄 Flujos Principales
1. Workflow de Validación Médica
ContentItem (draft)
↓ submit
ContentItem (in_review)
↓ approve/reject
ContentItem (approved/draft)
↓ publish (si approved)
ContentItem (published)
Implementación:
ValidationServiceorquesta transicionesContentStatusvalida transiciones permitidasValidationRepositorypersiste cambiosaudit_logsregistra acciones
2. Gestión de Contenido
Admin crea/edita ContentItem
↓
ContentService valida
↓
ContentRepository persiste
↓
Mapper convierte Domain ↔ Persistence
3. Búsqueda y Filtrado
Frontend → API endpoint
↓
Service aplica lógica de negocio
↓
Repository consulta PostgreSQL
↓
Mapper convierte a Domain
↓
Service retorna DTO
🔐 Seguridad
Autenticación
- JWT para autenticación de usuarios admin
- Roles:
admin,reviewer,validator - Middleware:
authenticate,requirePermission
Validación
- Zod en todos los puntos de entrada (API, forms)
- Validación de tipos en runtime
- Sanitización de inputs
Rate Limiting
- express-rate-limit en endpoints públicos
- Límites configurables por endpoint
🧪 Testing
Backend
- Tests unitarios: Servicios con repos mockeados
- Tests integración: API con
supertest - Cobertura objetivo: 80%+
Tests:
backend/src/application/services/__tests__/backend/src/__tests__/api.integration.test.ts
Frontend
- Tests unitarios: Componentes, hooks, utils
- Vitest como framework de testing
- Cobertura objetivo: 80%
Tests:
src/**/*.test.ts,src/**/*.test.tsx
📊 Entidades con Ciclo de Vida
ContentItem
Estados: draft → in_review → approved / published → archived
Transiciones:
draft→in_review(submit)in_review→approved(approve)in_review→published(approve + publish)in_review→draft(reject)approved→published(publish)- Cualquier estado →
archived(archive)
Implementación:
ContentStatusvalue object valida transicionesValidationServiceorquesta workflowaudit_logsregistra cambios
MedicalReview
Estados: pending → approved / rejected
Ciclo de vida: Asociado a ContentItem, no independiente.
⚠️ Separación: Tickets vs Modelo de Dominio
Tickets (Artefactos de Planificación)
- TICKET-001 a TICKET-019: Tareas técnicas de desarrollo
- NO son entidades del dominio
- NO tienen representación en código
- Documentados en:
docs/QUE_FALTA.md
Modelo de Dominio (Entidades Reales)
- ContentItem, Drug, GlossaryTerm, MediaResource, MedicalReview
- SÍ son entidades del dominio
- SÍ tienen representación en código (
domain/entities/) - Documentados en:
SPEC.md, este documento
🔮 Arquitectura Prevista (Evolución)
Mantenimiento de Clean Architecture
- ✅ Separación de capas ya implementada
- ✅ Reglas de dependencias respetadas
- ⚠️ Posibles mejoras: más tests, más documentación
Posibles Evoluciones
- Event Sourcing: Para auditoría completa (futuro)
- CQRS: Separar lectura/escritura si escala (futuro)
- Microservicios: Si el sistema crece significativamente (futuro)
Nota: Estas evoluciones deben documentarse en SPEC.md antes de implementarse.
📚 Referencias
- Especificación maestra:
SPEC.md - Reglas de código:
.cursorrules - Tareas pendientes:
README_TODO.md - Guía de desarrollo:
README_DEV.md
Última actualización: 2025-02-02