codigo0/docs/FASE_1_AISLAMIENTO_DATOS.md

152 lines
7.3 KiB
Markdown
Raw Normal View History

2026-01-19 08:10:16 +00:00
# FASE 1: AISLAMIENTO DE DATOS - COMPLETADA ✅
## Objetivo
Desacoplar los componentes y páginas de los datos hardcodeados en `src/data/*.ts`, haciendo que todo el acceso a datos pase por el `ContentAdapter`, manteniendo compatibilidad total y garantizando fallback automático a datos locales.
## Restricciones Cumplidas
- ✅ NO se modificó el contenido de `src/data/*.ts`
- ✅ NO se eliminaron ni movieron archivos existentes
- ✅ NO se cambiaron rutas
- ✅ NO se cambiaron componentes UI
- ✅ NO se tocó Service Worker ni lógica offline
- ✅ NO se introdujeron dependencias nuevas
## Archivos Migrados
### Páginas (5)
1. **`src/pages/Farmacos.tsx`**
- Eliminado: `import { drugs } from '@/data/drugs'`
- Agregado: `import { getAllDrugs, useContentAdapter } from '@/services/content-adapter'`
- Cambio: `const allDrugs = getAllDrugs()` en lugar de usar array directo
- Indicador visual: Badge "Externo" cuando se usa Content Pack
2. **`src/pages/RCP.tsx`**
- Eliminado: `import { getProcedureById } from '@/data/procedures'`
- Eliminado: `import { drugs, Drug } from '@/data/drugs'`
- Agregado: `import { getAllDrugs, getDrug, useProtocolAdapter } from '@/services/content-adapter'`
- Cambio: `findDrugByName()` ahora usa `getAllDrugs()` del ContentAdapter
- Cambio: Protocolos obtenidos mediante `useProtocolAdapter()` (fallback automático)
3. **`src/pages/ViaAerea.tsx`**
- Eliminado: `import { getProcedureById } from '@/data/procedures'`
- Cambio: Protocolo obtenido mediante `useProtocolAdapter()` (fallback automático)
4. **`src/pages/Shock.tsx`**
- Eliminado: `import { getProcedureById } from '@/data/procedures'`
- Cambio: Protocolo obtenido mediante `useProtocolAdapter()` (fallback automático)
5. **`src/pages/SoporteVital.tsx`**
- Eliminado: `import { procedures, getProceduresByCategory, Procedure } from '@/data/procedures'`
- Agregado: `import { getAllProtocols } from '@/services/content-adapter'`
- Cambio: `const soporteVitalProcedures = getAllProtocols().filter(p => p.category === 'soporte_vital')`
### Componentes (9)
1. **`src/components/layout/SearchModal.tsx`**
- Eliminado: `import { searchProcedures, ... } from '@/data/procedures'`
- Eliminado: `import { searchDrugs, ... } from '@/data/drugs'`
- Agregado: `import { searchProcedures, searchDrugs } from '@/services/content-search'`
- Nota: Se creó nuevo servicio `content-search.ts` que abstrae la búsqueda usando ContentAdapter
2. **`src/views/formativo/GuideIndex.tsx`**
- Eliminado: `import { getAllGuides } from '@/data/guides-index'`
- Agregado: `import { getAllGuides } from '@/services/content-adapter'`
3. **`src/views/formativo/GuideViewer.tsx`**
- Eliminado: `import { getGuideById } from '@/data/guides-index'`
- Agregado: `import { getGuide } from '@/services/content-adapter'`
- Cambio: `getGuideById(guia)``getGuide(guia)`
4. **`src/components/guide/GuideNavigation.tsx`**
- Eliminado: `import { getGuideById, getGuideSection } from '@/data/guides-index'`
- Agregado: `import { getGuide, getGuideSection } from '@/services/content-adapter'`
- Cambio: `getGuideById(guideId)``getGuide(guideId)`
5. **`src/views/formativo/GuideSectionViewer.tsx`**
- Eliminado: `import { getGuideById, getGuideSection } from '@/data/guides-index'`
- Agregado: `import { getGuide, getGuideSection } from '@/services/content-adapter'`
- Cambio: `getGuideById(guia)``getGuide(guia)`
6. **`src/components/guide/GuideHeader.tsx`**
- Cambio: `import { Guide } from '@/data/guides-index'``import type { Guide } from '@/services/content-adapter'`
- Nota: Solo importa tipos, no datos
7. **`src/components/guide/GuideCard.tsx`**
- Cambio: `import { Guide } from '@/data/guides-index'``import type { Guide } from '@/services/content-adapter'`
- Nota: Solo importa tipos, no datos
8. **`src/components/procedures/ProcedureCard.tsx`**
- Cambio: `import { Procedure, Priority } from '@/data/procedures'``import type { Procedure, Priority } from '@/data/procedures'`
- Nota: Solo importa tipos, no datos
9. **`src/components/drugs/DrugCard.tsx`**
- Cambio: `import { Drug } from '@/data/drugs'``import type { Drug } from '@/data/drugs'`
- Nota: Solo importa tipos, no datos
## Servicios Creados/Actualizados
### Nuevo: `src/services/content-search.ts`
Servicio que abstrae la búsqueda de contenido usando ContentAdapter:
- `searchProcedures(query: string): Procedure[]` - Busca protocolos
- `searchDrugs(query: string): Drug[]` - Busca fármacos
Ambas funciones usan `getAllProtocols()` y `getAllDrugs()` del ContentAdapter, garantizando fallback automático.
### Actualizado: `src/services/content-adapter.ts`
- **Interfaz `ContentAdapter`**: Agregado método `getGuideSection(guideId: string, numero: number)`
- **`LocalContentAdapter`**: Implementado `getGuideSection()` que delega a `src/data/guides-index.ts`
- **`ExternalContentAdapter`**: Implementado `getGuideSection()` que busca en la guía obtenida
- **Funciones exportadas**: Agregada `getGuideSection()` como función helper
## Resultados
### ✅ Logros
- **14 archivos migrados** (5 páginas + 9 componentes)
- **0 imports directos** de datos en componentes/páginas principales
- **Fallback automático** garantizado en todos los casos
- **Compatibilidad total** mantenida - app funciona exactamente igual
- **Sin errores de linter**
- **Preparada para backend** - lista para consumir datos desde base de datos
### 📊 Estadísticas
- **Páginas migradas**: 5/5 principales (100%)
- **Componentes migrados**: 9/9 principales (100%)
- **Servicios creados**: 1 nuevo (`content-search.ts`)
- **Servicios actualizados**: 1 (`content-adapter.ts`)
### 🔒 Archivos que DEBEN seguir importando desde `src/data/`
Estos archivos son correctos y deben mantener sus imports:
- `src/services/content-adapter.ts` - `LocalContentAdapter` necesita acceder a los datos locales
- `src/services/content-relations.ts` - Puede necesitar mapeos de `src/data/protocol-guide-manual-mapping.ts`
### 📝 Notas Técnicas
1. **Tipos vs Datos**: Los componentes que solo necesitan tipos (interfaces) ahora usan `import type`, lo cual es correcto y no rompe el aislamiento.
2. **Fallback Automático**: El `ContentAdapterFactory` decide automáticamente si usar `ExternalContentAdapter` (si hay Content Pack disponible) o `LocalContentAdapter` (fallback).
3. **Búsqueda Abstraída**: La búsqueda ahora pasa por `content-search.ts`, que internamente usa ContentAdapter, garantizando consistencia.
4. **Guías**: Se agregó soporte completo para `getGuideSection()` en ambos adapters, permitiendo acceso a secciones individuales de guías.
## Próximos Pasos (FASE 2+)
- Implementar backend y base de datos
- Generar Content Pack desde base de datos
- Panel de administración para gestionar contenido
- Migración de datos desde `src/data/` a base de datos
## Verificación
Para verificar que la migración fue exitosa:
```bash
# Buscar imports directos en componentes/páginas (debe estar vacío o solo tipos)
find src/pages src/components src/views -type f \( -name "*.ts" -o -name "*.tsx" \) \
-exec grep -l "from.*@/data/\|from.*\.\./data/" {} \; | \
grep -v "type.*from"
```
---
**Fecha de completación**: 2024
**Estado**: ✅ COMPLETADA
**Compatibilidad**: 100% mantenida
**Preparación para FASE 2**: ✅ Lista