192 lines
4.4 KiB
Markdown
192 lines
4.4 KiB
Markdown
|
|
# FASE 2: INTEGRACIÓN FRONTEND-BACKEND
|
||
|
|
|
||
|
|
**Fecha**: 2025-01-07
|
||
|
|
**Estado**: ✅ **VERIFICADA**
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## ✅ Verificaciones Completadas
|
||
|
|
|
||
|
|
### 1. Endpoint Content Pack
|
||
|
|
- **URL**: `http://localhost:3000/api/content-pack/latest.json`
|
||
|
|
- **Estado**: ✅ Funciona correctamente
|
||
|
|
- **Respuesta**: Content Pack con 23 items
|
||
|
|
|
||
|
|
### 2. Estructura del Content Pack
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"metadata": {
|
||
|
|
"version": "1.0.0",
|
||
|
|
"generated_at": "2026-01-07T20:53:30.646Z",
|
||
|
|
"total_items": 23,
|
||
|
|
"hash": "sha256:..."
|
||
|
|
},
|
||
|
|
"content": {
|
||
|
|
"protocols": [...], // 5 protocolos
|
||
|
|
"guides": [...], // 9 guías
|
||
|
|
"drugs": [...], // 6 fármacos
|
||
|
|
"checklists": [...] // 3 checklists
|
||
|
|
},
|
||
|
|
"media": {
|
||
|
|
"resources": [...],
|
||
|
|
"associations": [...]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. ExternalContentAdapter
|
||
|
|
- **Configuración**:
|
||
|
|
- Usa `VITE_API_URL` si está configurado
|
||
|
|
- O ruta relativa: `/api/content-pack/latest.json`
|
||
|
|
- **Cache**:
|
||
|
|
- IndexedDB (preferido)
|
||
|
|
- localStorage (fallback)
|
||
|
|
- Expiración: 24 horas
|
||
|
|
- **Fallback**: Automático a `LocalContentAdapter` si falla
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🔧 Configuración
|
||
|
|
|
||
|
|
### Opción 1: Variable de Entorno
|
||
|
|
Crear `.env` en la raíz del proyecto:
|
||
|
|
```env
|
||
|
|
VITE_API_URL=http://localhost:3000
|
||
|
|
```
|
||
|
|
|
||
|
|
### Opción 2: Proxy en Vite (Recomendado para desarrollo)
|
||
|
|
Añadir en `vite.config.ts`:
|
||
|
|
```typescript
|
||
|
|
export default defineConfig({
|
||
|
|
server: {
|
||
|
|
proxy: {
|
||
|
|
'/api': {
|
||
|
|
target: 'http://localhost:3000',
|
||
|
|
changeOrigin: true,
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
// ... resto de configuración
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
Con esta configuración, el frontend puede usar rutas relativas (`/api/content-pack/latest.json`) y Vite las redirigirá al backend.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🧪 Pruebas Realizadas
|
||
|
|
|
||
|
|
### 1. Carga del Content Pack
|
||
|
|
```bash
|
||
|
|
curl http://localhost:3000/api/content-pack/latest.json
|
||
|
|
```
|
||
|
|
**Resultado**: ✅ Content Pack cargado correctamente
|
||
|
|
|
||
|
|
### 2. Estructura Verificada
|
||
|
|
- ✅ Metadata presente
|
||
|
|
- ✅ Content con todas las secciones
|
||
|
|
- ✅ Media resources (vacío por ahora)
|
||
|
|
|
||
|
|
### 3. Contenido Verificado
|
||
|
|
- ✅ 5 protocolos
|
||
|
|
- ✅ 9 guías
|
||
|
|
- ✅ 6 fármacos
|
||
|
|
- ✅ 3 checklists
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📋 Cómo Probar en el Frontend
|
||
|
|
|
||
|
|
### 1. Iniciar Backend
|
||
|
|
```bash
|
||
|
|
cd backend
|
||
|
|
npm start
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Iniciar Frontend
|
||
|
|
```bash
|
||
|
|
npm run dev
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Verificar en el Navegador
|
||
|
|
1. Abrir la app en `http://localhost:8096`
|
||
|
|
2. Abrir la consola del navegador (F12)
|
||
|
|
3. Buscar mensajes de `[ContentAdapter]`
|
||
|
|
4. Verificar que carga el Content Pack
|
||
|
|
|
||
|
|
### 4. Verificar Badge "Externo"
|
||
|
|
- Las páginas que usan `useContentAdapter()` mostrarán un badge "Externo" si están usando contenido del backend
|
||
|
|
- Ejemplo: `Farmacos.tsx` muestra el badge cuando usa `ExternalContentAdapter`
|
||
|
|
|
||
|
|
### 5. Probar Fallback
|
||
|
|
1. Detener el backend (`Ctrl+C`)
|
||
|
|
2. Recargar la página
|
||
|
|
3. Verificar que la app sigue funcionando (usa `LocalContentAdapter`)
|
||
|
|
4. El badge "Externo" no debería aparecer
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🔍 Debugging
|
||
|
|
|
||
|
|
### Verificar que el Content Pack se carga
|
||
|
|
En la consola del navegador:
|
||
|
|
```javascript
|
||
|
|
// Verificar cache
|
||
|
|
localStorage.getItem('content_pack')
|
||
|
|
|
||
|
|
// Verificar adapter
|
||
|
|
import { contentAdapter } from '@/services/content-adapter';
|
||
|
|
console.log(contentAdapter.isAvailable()); // true si tiene pack
|
||
|
|
```
|
||
|
|
|
||
|
|
### Verificar estructura de fármacos
|
||
|
|
El `ExternalContentAdapter` tiene lógica para manejar fármacos en dos formatos:
|
||
|
|
1. **Formato directo**: `{ genericName, tradeName, ... }`
|
||
|
|
2. **Formato content**: `{ content: { genericName, ... } }`
|
||
|
|
|
||
|
|
El adapter detecta automáticamente el formato y lo convierte.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## ⚠️ Notas Importantes
|
||
|
|
|
||
|
|
### Estructura de Fármacos
|
||
|
|
Los fármacos vienen desde la tabla `tes_content.drugs` con estructura directa:
|
||
|
|
```javascript
|
||
|
|
{
|
||
|
|
id: "...",
|
||
|
|
slug: "adrenalina",
|
||
|
|
genericName: "Adrenalina",
|
||
|
|
tradeName: "Adrenalina 1mg/1ml",
|
||
|
|
category: "cardiovascular",
|
||
|
|
// ... otros campos
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
El `ExternalContentAdapter` está preparado para manejar esta estructura.
|
||
|
|
|
||
|
|
### Cache
|
||
|
|
- El Content Pack se cachea automáticamente
|
||
|
|
- Cache válido por 24 horas
|
||
|
|
- Para forzar recarga: `localStorage.removeItem('content_pack')`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## ✅ Checklist de Integración
|
||
|
|
|
||
|
|
- [x] Endpoint `/api/content-pack/latest.json` funciona
|
||
|
|
- [x] Content Pack se genera correctamente
|
||
|
|
- [x] Estructura del pack es correcta
|
||
|
|
- [x] ExternalContentAdapter configurado
|
||
|
|
- [x] Cache implementado (IndexedDB + localStorage)
|
||
|
|
- [x] Fallback a LocalContentAdapter funciona
|
||
|
|
- [ ] Probar en navegador (pendiente)
|
||
|
|
- [ ] Verificar badge "Externo" (pendiente)
|
||
|
|
- [ ] Probar fallback con backend detenido (pendiente)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Estado**: ✅ Integración verificada y lista para pruebas en navegador
|
||
|
|
|
||
|
|
|