- ✅ Ticket 1.1: Estructura Clean Architecture en backend - ✅ Ticket 1.2: Schemas Zod compartidos - ✅ Ticket 1.3: Refactorización drugs.ts (1362 → 8 archivos modulares) - ✅ Ticket 1.4: Refactorización procedures.ts (3583 → 6 archivos modulares) - ✅ Ticket 1.5: Eliminación de duplicidades (~50 líneas) Cambios principales: - Creada estructura Clean Architecture en backend/src/ - Schemas Zod compartidos en backend/src/shared/schemas/ - Refactorización modular de drugs y procedures - Utilidades genéricas en src/utils/ (filter, validation) - Eliminados scripts obsoletos y documentación antigua - Corregidos errores: QueryClient, import test-error-handling - Build verificado y funcionando correctamente
3.6 KiB
3.6 KiB
📋 Decisiones Técnicas Consolidadas
Fecha: 2025-01-25
Versión: 1.0
✅ DECISIONES TOMADAS
1. Value Objects (Híbrido) ✅
- Decisión: Tipos simples en entidades, Value Objects en servicios
- Implementación:
- Entidades usan
ContentStatusType,ContentPriorityType(strings) - Value Objects (
ContentStatus,ContentPriority) en Application Services - Domain Layer mantiene entidades como POJOs
- Entidades usan
2. Serialización (Mappers) ✅
- Decisión: Mappers separados en Infrastructure Layer
- Implementación:
infrastructure/mappers/ContentItemMapper.ts- Métodos
toDomain()ytoPersistence() - Domain Layer NO tiene métodos de serialización
3. IDs (Application Layer) ✅
- Decisión: UUIDs generados en Application Layer
- Implementación:
- Generar con
randomUUID()en Use Cases - Pasar como parámetro a
create()de entidades - Permite inyección en tests
- Generar con
4. Validación (Híbrido) ✅
- Decisión: Validaciones básicas en Domain, complejas en Application
- Implementación:
- Validaciones de formato en
create()de entidades - Validaciones de negocio (unicidad, dependencias) en Services
- Zod en Application Layer para esquemas
- Validaciones de formato en
5. Fechas (ISO 8601 Strings) ✅
- Decisión: Strings ISO 8601 en entidades
- Implementación:
readonly createdAt: string(formato:"2025-01-25T10:00:00Z")- Mappers convierten strings ↔ PostgreSQL TIMESTAMPTZ
- NO usar
Datenativo
6. Arrays (readonly T[]) ✅
- Decisión:
readonly string[]para arrays inmutables - Implementación:
readonly tags: readonly string[]- NO usar
ReadonlyArray<T>
7. Opcionales (Híbrido) ✅
- Decisión:
?para opcionales,| nullcuando null tiene significado - Implementación:
readonly description?: string(no proporcionado)readonly validatedAt: string | null(explícitamente null)
8. Errores (Personalizados) ✅
- Decisión: Errores personalizados (
DomainError,ValidationError) - Implementación:
shared/errors/DomainError.ts- Errores con código y contexto
- NO usar errores genéricos
9. Versionado (Números Enteros) ✅
- Decisión: Números enteros incrementales
- Implementación:
readonly version: numberreadonly latestVersion: number- NO usar semantic versioning
10. JSONB (Union Types) ✅
- Decisión: Union types para campo
content - Implementación:
content: ProtocolContent | GuideContent | ManualContent- Type safety completo
- NO usar
Record<string, unknown>
📐 IMPACTO EN ARQUITECTURA
Domain Layer
- Entidades con tipos simples
- Value Objects como clases separadas
- Métodos
create()con validaciones básicas - IDs recibidos como parámetro
Application Layer
- Generación de UUIDs
- Validaciones complejas con repositorios
- Uso de Value Objects para lógica
- Zod para validación de esquemas
Infrastructure Layer
- Mappers para conversión Domain ↔ Persistence
- Conversión de fechas (string ↔ TIMESTAMPTZ)
- Conversión de nombres (camelCase ↔ snake_case)
🔄 FLUJO COMPLETO
Crear Contenido
- Presentation Layer: Recibe request, valida con Zod
- Application Layer:
- Genera UUID
- Valida unicidad (repository)
- Crea entidad con
ContentItem.create(id, ...)
- Domain Layer:
- Valida formato básico
- Retorna entidad inmutable
- Application Layer:
- Guarda con repository
- Infrastructure Layer:
- Mapper convierte a formato BD
- Persiste en PostgreSQL
Fin del documento