Files
renato97 07929b6c60 feat: fase 4 — overhaul, docker, seguridad, métodos europeos
- 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
2026-07-25 22:34:05 -03:00

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) |