codigo0/docs/FASE_1_AISLAMIENTO_DATOS.md

7.3 KiB

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:

# 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