- Añade ImportRunner en memoria con concurrencia configurable - Tests TDD para enqueue, concurrencia y comportamiento tras stop - Actualiza /api/import/scan para encolar jobs y registrar errores - Ajusta tsconfig.json para incluir tests en comprobaciones de tipo
8.9 KiB
Plan: Importador de ROMs (Fase 4)
TL;DR: Estabilizar el entorno de tests y, mediante TDD, implementar la pipeline de importación de ROMs: escaneo de ficheros, cálculo de checksums, verificación contra DATs, persistencia en Prisma y un runner en background. Se comenzará con un runner en memoria y se dejará la puerta abierta para migrar a Redis posteriormente.
Phases
-
Phase 1: Estabilizar entorno y ejecutar tests
- Objective: Obtener una línea base reproducible donde
yarn --cwd backend testse ejecute y muestre resultados claros. - Files/Functions to Modify/Create:
backend/tsconfig.json,backend/package.json,backend/prisma/schema.prisma,backend/src/plugins/prisma.ts. - Tests to Write: Ninguno nuevo; ejecutar y capturar los tests existentes (
backend/tests/**). - Steps:
- Ejecutar
yarn installen la raíz y generar el cliente Prisma (prisma generate) enbackend/. - Ejecutar
yarn --cwd backend testy documentar fallos. - Corregir problemas de
prisma generateotsconfigy validar que los tests relevantes pasan.
- Ejecutar
- Objective: Obtener una línea base reproducible donde
-
Phase 2: Persistencia básica e integración con la ruta de import
- Objective: Implementar
importServiceque usescanDirectoryycomputeHashespara persistirRomFile(upsert por checksum) y, cuando sea posible, vincular/crearGame. - Files/Functions to Modify/Create:
backend/src/services/importService.ts, actualizarbackend/src/routes/import.tspara invocar el servicio. - Tests to Write:
backend/tests/services/importService.spec.ts, actualizarbackend/tests/routes/import.spec.tspara escenariospersist: true/false. - Steps:
- Escribir tests (falla roja).
- Implementar mínimo para pasar tests (green).
- Refactor y asegurar idempotencia (re-run tests).
- Objective: Implementar
-
Phase 3: ArchiveReader — soportar zip/7z/chd
- Objective: Leer/listar contenido de contenedores (ZIP, 7z, CHD) sin extracción completa para indexar ROMs internos.
- Files/Functions to Modify/Create:
backend/src/services/archiveReader.ts; adaptarbackend/src/services/fsScanner.tspara delegar enarchiveReadercuandoisArchive. - Tests to Write:
backend/tests/services/archiveReader.spec.ts(fixtures: zips/7z/CHD bajobackend/tests/fixtures). - Steps:
- Añadir tests que describan el comportamiento esperado (falla roja).
- Implementar con librería elegida y validar en CI con binarios instalados.
-
Phase 4: DAT parsing y verificación
- Objective: Parsear DAT XML y comprobar si un ROM coincide con una entrada DAT (por checksums/size/name).
- Files/Functions to Modify/Create:
backend/src/services/datVerifier.ts(completar), añadir utilidades de parseo XML. - Tests to Write:
backend/tests/services/datVerifier.spec.ts(unidad + integración, usarINTEGRATION=1para pruebas que dependan de binarios/fixtures grandes). - Steps:
- Implementar parseo y matching (falla roja).
- Integrarlo en
importServicepara sugerir o asociarGame.
-
Phase 5: Job runner en memoria (inicio) — migrable a Redis
- Objective: Implementar un runner en memoria que procese jobs de import con control de concurrencia (
IMPORT_CONCURRENCY), estado básico y capacidad de encolar tareas desde la ruta/api/import/scan. - Files/Functions to Modify/Create:
backend/src/config.ts,backend/src/jobs/importRunner.ts, tests enbackend/tests/jobs/importRunner.spec.ts, actualizarbackend/src/routes/import.tspara encolar jobs. - Tests to Write:
backend/tests/jobs/importRunner.spec.ts(enqueue/resolución, concurrencia, getStatus). - Steps:
- Escribir tests (falla roja).
- Implementar runner in-memory (green).
- Integrar con la ruta de import y validar comportamiento en tests.
- Objective: Implementar un runner en memoria que procese jobs de import con control de concurrencia (
-
Phase 6: CI e integración de binarios
- Objective: Preparar workflows para ejecutar pruebas de integración que dependan de binarios (
7z,chdman) y asegurarprisma generateen CI. - Files/Functions to Modify/Create:
.github/workflows/ci.yml, documentación enREADME.md. - Steps:
- Crear workflow que haga
yarn install,yarn --cwd backend prisma generate, instale binarios (o use contenedor preparado) y ejecuteyarn --cwd backend testconINTEGRATION=1cuando corresponda.
- Crear workflow que haga
- Objective: Preparar workflows para ejecutar pruebas de integración que dependan de binarios (
Open Questions
- ¿Persistimos
ImportJoben DB desde el inicio (útil para resume/retry) o lo dejamos para una futura migración a Redis? (Persistir ahora / Posponer) - ¿En CI preferís instalar
7z/chdmano marcar tests de archive/CHD como opcionales conINTEGRATION=1y ejecutarlos solo si runner proporciona binarios? (Instalar / Opcional) - ¿Creación automática de
Gameal no encontrar DAT match? (Crear placeholder conslug/ Solo guardarRomFile) - Política de colas a largo plazo: ¿Redis desde el inicio o in-memory ahora y migrar luego? (Usuario eligió: in-memory ahora)
Plan: Importadores y gestión de ROMs (Fase 4)
Implementar servicios para escanear directorios de ROMs, detectar formatos (ZIP/7z/CHD), calcular checksums (CRC32/MD5/SHA1), verificar contra DATs (No-Intro/Redump) y persistir RomFile en la BD. El escaneo se lanzará desde el frontend, correrá como job en background y la ruta a las ROMs será una configuración del sistema (no se envía en cada request). Se añadirá la variable IMPORT_CONCURRENCY con cálculo por defecto.
Phases 4
-
Phase 4.1: Tests y fixtures (TDD)
- Objective: Escribir tests y fixtures que guiarán la implementación; los tests deben fallar inicialmente.
- Files a crear:
backend/tests/fixtures/simple-rom.bin— fixture ROM sintéticabackend/tests/fixtures/nested/nested-rom.bin— fixture en subdirectoriobackend/tests/fixtures/dats/sample-no-intro.dat.xml— DAT XML mínimobackend/tests/services/fsScanner.spec.tsbackend/tests/services/checksumService.spec.tsbackend/tests/services/datVerifier.spec.ts(marcar integración para binarios cuando aplique)backend/tests/routes/import.spec.ts
- Criterio de aceptación: Los tests existen y fallan por falta de implementación (TDD).
-
Phase 4.2: Core — Scanner y checksums
- Objective: Implementar
fsScannerychecksumServicecon streaming y control de concurrencia. - Files a crear:
backend/src/services/fsScanner.tsbackend/src/services/checksumService.tsbackend/src/lib/fileTypeDetector.ts
- Criterio de aceptación: Tests unitarios de Phase 4.1 pasan para los casos no relacionados con archives/CHD.
- Objective: Implementar
-
Phase 4.3: Archives y DAT verification
- Objective: Implementar
archiveReader(ZIP, 7z opcional) ydatVerifier. - Files a crear:
backend/src/services/archiveReader.tsbackend/src/services/datVerifier.ts
- Notas: CHD será soportado opcionalmente mediante
chdman(si está instalado en el sistema); en la MVP se tratará CHD como blob para checksums sichdmanno está presente.
- Objective: Implementar
-
Phase 4.4: API, job en background y E2E
- Objective: Añadir endpoint
POST /api/import/scan(sin recibir path; usa la ruta preconfigurada), job runner en background, endpointsGET /api/import/status/:taskIdyGET /api/import/result/:taskId, y pruebas E2E que verifiquen persistencia en Prisma. - Files a crear:
backend/src/routes/import.tsbackend/src/controllers/importController.tsbackend/src/plugins/importJobs.ts(cola en proceso; migrable a Redis/BullMQ)
- Criterio de aceptación: E2E de import completo pasa en CI (con binarios instalados según sea necesario).
- Objective: Añadir endpoint
Decisiones tomadas
chdmansoporte: opcional. Si está instalado, lo usaremos; si no, se calcula checksum y se trata como blob.- Endpoint
POST /api/import/scan: no recibepath; la ruta a las ROMs se configura en el sistema (env varROMS_PATH). - El job se ejecuta en background; el frontend lanza el job a petición del usuario (botón "Scan").
- Añadir
IMPORT_CONCURRENCY(env var). Valor por defecto:min(8, max(1, os.cpus().length - 1))si no se configura. - Tests que dependen de binarios (7z/chdman): se incluirán como tests de integración y se habilitarán en CI (instalación de binarios en workflow).
Open Questions (resueltas por el usuario):
- Soporte
chdmanopcional — Aprobado. - No enviar
pathen payload; usar ruta preconfigurada — Aprobado (ROMS_PATH). - Job en background — Aprobado.
IMPORT_CONCURRENCYvariable y fórmula por defecto — Aprobado.- Incluir tests dependientes de binarios y instalarlos en CI — Aprobado.
Siguientes pasos (Phase 4.1 - TDD):
- Crear fixtures y tests unitarios marcados en Phase 4.1.
- Ejecutar
yarn --cwd backend testy observar tests fallidos. - Implementar servicios mínimos en Phase 4.2 para pasar tests básicos.
Metadatos:
- Autor: GitHub Copilot
- Fecha: 2026-02-08