codigo0/docs/DECISIONES_TECNICAS_CONSOLIDADAS.md
planetazuzu 5d7a6500fe refactor: Fase 1 - Clean Architecture, refactorización modular y eliminación de duplicidades
-  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
2026-01-25 21:09:47 +01:00

122 lines
3.6 KiB
Markdown

# 📋 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
### 2. Serialización (Mappers) ✅
- **Decisión:** Mappers separados en Infrastructure Layer
- **Implementación:**
- `infrastructure/mappers/ContentItemMapper.ts`
- Métodos `toDomain()` y `toPersistence()`
- 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
### 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
### 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 `Date` nativo
### 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, `| null` cuando 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: number`
- `readonly 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
1. **Presentation Layer:** Recibe request, valida con Zod
2. **Application Layer:**
- Genera UUID
- Valida unicidad (repository)
- Crea entidad con `ContentItem.create(id, ...)`
3. **Domain Layer:**
- Valida formato básico
- Retorna entidad inmutable
4. **Application Layer:**
- Guarda con repository
5. **Infrastructure Layer:**
- Mapper convierte a formato BD
- Persiste en PostgreSQL
---
**Fin del documento**