- Eliminada ruta duplicada /sebastian/sumas (código muerto) - Removido topic 'sumas' del engine (reemplazado por 'matematicas') - Creado docker-compose.yml (PostgreSQL + app, 1 comando install) - Dockerfile: copiado prisma CLI al runner stage para db push - APIs debug protegidas: 403 en producción (reset, state, seed) - Audit métodos europeos: 24 archivos corregidos al 100% - Montessori: matemática Francesca + Sebastián - Decroly: lectura, ortografía, historia, geografía, banderas - Borel-Maisonny: lectura inicial Isabella (ya existía) - Freinet: expresión escrita Sebastián (ya existía) - Validación prerequisitos: 0 rotos en contenido nuevo (157 ejercicios) - INSTALL.md: guía completa de instalación - fase4.md: documentación del overhaul - E2E: 2 tests corregidos, 61/61 pasan - TypeScript: exit 0, Build: exit 0
149 lines
4.4 KiB
Markdown
149 lines
4.4 KiB
Markdown
# FASE 4 — Overhaul, Bug Fixes y Hardening Final
|
|
|
|
> **Objetivo**: Code review completo, eliminación de código muerto, seguridad, Docker para instalación, y verificación de métodos europeos.
|
|
|
|
---
|
|
|
|
## 0. Resumen Ejecutivo
|
|
|
|
| Categoría | Ítems |
|
|
|-----------|-------|
|
|
| Código muerto eliminado | 1 ruta duplicada + 1 topic legacy en engine |
|
|
| Vulnerabilidades corregidas | 3 APIs debug sin auth → bloqueadas en producción |
|
|
| Docker para instalación | docker-compose.yml + Dockerfile con prisma CLI |
|
|
| Métodos europeos auditados | 24 archivos corregidos (100% cobertura) |
|
|
| Prerequisitos validados | 157 ejercicios nuevos verificados (0 rotos) |
|
|
| E2E tests | 61 pasan (2 corregidos tras eliminar ruta) |
|
|
| Build + TypeScript | ✅ Ambos pasan |
|
|
|
|
---
|
|
|
|
## 1. Bug Fixes
|
|
|
|
### 1.1 Ruta duplicada /sebastian/sumas
|
|
|
|
**Problema**: Existían dos rutas que apuntaban a la misma carpeta del currículum:
|
|
- `/sebastian/sumas` (legacy)
|
|
- `/sebastian/matematicas` (actual)
|
|
|
|
La home page de Sebastián ya usaba `matematicas`, pero `sumas` seguía como código muerto.
|
|
|
|
**Fix**:
|
|
- Eliminada `app/sebastian/sumas/page.tsx`
|
|
- Removido topic `sumas` del engine (`PROFILE_CURRICULA`)
|
|
- Actualizados 2 tests E2E que referenciaban la ruta eliminada
|
|
|
|
### 1.2 APIs de debug sin protección
|
|
|
|
**Problema**: Los endpoints `/api/debug/reset`, `/api/debug/state`, `/api/debug/seed` eran accesibles sin autenticación en cualquier entorno. Cualquiera podía:
|
|
- Borrar todo el progreso de un child (`reset`)
|
|
- Leer datos privados (`state`)
|
|
- Inyectar datos falsos (`seed`)
|
|
|
|
**Fix**: Guard de `NODE_ENV` al inicio de cada handler:
|
|
|
|
```typescript
|
|
if (process.env.NODE_ENV === "production") {
|
|
return NextResponse.json({ error: "Not available in production" }, { status: 403 })
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 2. Docker para Instalación
|
|
|
|
### 2.1 docker-compose.yml (NUEVO)
|
|
|
|
Servicio `db` (PostgreSQL 16-alpine) + servicio `app` (build desde Dockerfile).
|
|
|
|
```yaml
|
|
services:
|
|
db:
|
|
image: postgres:16-alpine
|
|
volumes:
|
|
- pgdata:/var/lib/postgresql/data
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U edueasy -d edueasy"]
|
|
app:
|
|
build: .
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
command: sh -c "npx prisma db push --skip-generate && node server.js"
|
|
```
|
|
|
|
Instalación: `docker compose up -d` → app en `http://localhost:3000`.
|
|
|
|
### 2.2 Dockerfile actualizado
|
|
|
|
Copiado `node_modules/prisma` (CLI) y `node_modules/@prisma` (client) al runner stage para que `prisma db push` funcione en el contenedor.
|
|
|
|
---
|
|
|
|
## 3. Audit de Métodos Europeos
|
|
|
|
### 3.1 Problema
|
|
|
|
24 archivos de currículum NO mencionaban ningún método europeo en su `functionalContext`.
|
|
|
|
### 3.2 Fix
|
|
|
|
Añadida referencia al método correspondiente en cada archivo:
|
|
|
|
| Método | Aplicación | Archivos |
|
|
|--------|------------|----------|
|
|
| **Montessori** | Matemática (Francesca + Sebastián) | 6 archivos |
|
|
| **Decroly** | Lectura, ortografía, historia, geografía, banderas | 18 archivos |
|
|
| **Borel-Maisonny** | Lectura inicial (Isabella, ya existía) | 0 cambios |
|
|
| **Freinet** | Expresión escrita (Sebastián lectura, ya existía) | 0 cambios |
|
|
|
|
**Resultado**: 100% de archivos con método europeo referenciado.
|
|
|
|
---
|
|
|
|
## 4. Validación de Prerequisitos
|
|
|
|
### 4.1 Script de validación
|
|
|
|
Creado script que recorre todos los archivos de currículum y verifica:
|
|
- **0 self-references** (ejercicio que se requiere a sí mismo)
|
|
- **0 prereqs faltantes** en contenido nuevo (Francesca + Sebastián)
|
|
|
|
### 4.2 Resultado
|
|
|
|
| Check | Contenido nuevo (Francesca + Sebastián) |
|
|
|-------|----------------------------------------|
|
|
| Self-references | 0 ✅ |
|
|
| Prereqs faltantes | 0 ✅ |
|
|
| IDs verificados | 157 |
|
|
|
|
Los 24 prereqs "faltantes" en Isabella son false positives del parser (template literals no resueltos por regex).
|
|
|
|
---
|
|
|
|
## 5. Documentación
|
|
|
|
### 5.1 INSTALL.md (NUEVO)
|
|
|
|
Guía de instalación completa:
|
|
- Docker compose (1 comando)
|
|
- Instalación manual (Node + PostgreSQL + espeak-ng)
|
|
- Descripción de perfiles y materias
|
|
- APIs de debug documentadas
|
|
- Estructura del proyecto
|
|
|
|
---
|
|
|
|
## 6. Estado Final
|
|
|
|
| Criterio | Estado |
|
|
|----------|--------|
|
|
| TypeScript compila | ✅ `npx tsc --noEmit` exit 0 |
|
|
| Build Next.js | ✅ `npm run build` exit 0 |
|
|
| E2E tests | ✅ 61/61 pasan |
|
|
| Docker | ✅ `docker compose up` listo |
|
|
| Métodos europeos | ✅ 100% cobertura |
|
|
| Seguridad debug APIs | ✅ Bloqueadas en producción |
|
|
| Código muerto | ✅ Eliminado |
|
|
| Prerequisitos | ✅ Validados (0 rotos en nuevo) |
|