codigo0/README_ARCHITECTURE.md

402 lines
11 KiB
Markdown
Raw Normal View History

# 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 contenido
- `IDrugRepository` - Operaciones CRUD de fármacos
- `IGlossaryRepository` - Operaciones CRUD de glosario
- `IValidationRepository` - Operaciones de validación médica
- `IMediaRepository` - 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 contenido
- `DrugRepository` - PostgreSQL para fármacos
- `GlossaryRepository` - PostgreSQL para glosario
- `ValidationRepository` - PostgreSQL para validación
- `MediaRepository` - PostgreSQL para medios
#### Mappers
- `ContentItemMapper` - Domain ↔ Persistence
- `DrugMapper` - Domain ↔ Persistence
- `GlossaryTermMapper` - 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 JWT
- `validate.ts` - Validación de requests con Zod
- `rate-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, manuales
- `drugs` - Fármacos
- `glossary_terms` - Términos del glosario
- `media_resources` - Medios audiovisuales
- `audit_logs` - Logs de auditoría
- `users` - Usuarios (admin)
- `content_versions` - Versiones de contenido
- `content_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:**
- `ValidationService` orquesta transiciones
- `ContentStatus` valida transiciones permitidas
- `ValidationRepository` persiste cambios
- `audit_logs` registra 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:**
- `ContentStatus` value object valida transiciones
- `ValidationService` orquesta workflow
- `audit_logs` registra 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