- ✅ 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
122 lines
3.6 KiB
Markdown
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**
|