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
This commit is contained in:
renato97
2026-07-25 22:34:05 -03:00
parent a3360ec6e4
commit 07929b6c60
36 changed files with 367 additions and 80 deletions
+3
View File
@@ -2,6 +2,9 @@ import { NextRequest, NextResponse } from "next/server"
import { prisma } from "@/lib/db"
export async function POST(request: NextRequest) {
if (process.env.NODE_ENV === "production") {
return NextResponse.json({ error: "Not available in production" }, { status: 403 })
}
try {
const { childId } = await request.json()
if (!childId) {
+3
View File
@@ -3,6 +3,9 @@ import { prisma } from "@/lib/db"
import { getStagesForProfile } from "@/lib/curriculum/engine"
export async function POST(request: NextRequest) {
if (process.env.NODE_ENV === "production") {
return NextResponse.json({ error: "Not available in production" }, { status: 403 })
}
try {
const { childId, profile = "ISABELLA", topic = "lectura", stages: stageIds, markAllCorrect = false } = await request.json()
if (!childId) {
+3
View File
@@ -3,6 +3,9 @@ import { prisma } from "@/lib/db"
import { getStagesForProfile } from "@/lib/curriculum/engine"
export async function GET(request: NextRequest) {
if (process.env.NODE_ENV === "production") {
return NextResponse.json({ error: "Not available in production" }, { status: 403 })
}
try {
const childId = request.nextUrl.searchParams.get("childId")
const profile = request.nextUrl.searchParams.get("profile") || "ISABELLA"
-12
View File
@@ -1,12 +0,0 @@
import ExerciseSession from "@/components/child/exercise-session"
export default function SebastianSumas() {
return (
<ExerciseSession
topic="sumas"
profile="SEBASTIAN"
loadingMessage="Preparando sumas..."
completeMessage="¡Terminaste las sumas por ahora!"
/>
)
}