codigo0/README_ARCHITECTURE.md

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 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: draftin_reviewapproved / publishedarchived

Transiciones:

  • draftin_review (submit)
  • in_reviewapproved (approve)
  • in_reviewpublished (approve + publish)
  • in_reviewdraft (reject)
  • approvedpublished (publish)
  • Cualquier estado → archived (archive)

Implementación:

  • ContentStatus value object valida transiciones
  • ValidationService orquesta workflow
  • audit_logs registra cambios

MedicalReview

Estados: pendingapproved / 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