batchCooking/apps/api/src/scripts/seed-runtime.ts
Nicolas deec91c5a3 fix(recipes): synchronise les sources en base au démarrage de l'image de prod
Le conteneur de prod ne peuplait jamais la table Source : seed-runtime.ts
(l'entrée seed de l'image Docker, exécutée après `prisma migrate deploy`)
n'appelait que seedReferenceData(), jamais registerAllRecipeSources()/
syncRecipeSources() — contrairement à prisma/seed.ts (dev). server.ts
enregistre bien les adaptateurs dans son propre registre en mémoire, mais
c'est un processus distinct de celui qui lance seed-runtime.js dans la
chaîne CMD du Dockerfile ; sans ce sync, GET /reference/sources renvoyait
toujours [], et HouseholdSettingsPage masquait silencieusement toute la
section sources (sources.length === 0 → return null). C'est ce que
l'utilisateur a remarqué : impossible de paramétrer les sources visibles
du foyer en prod.

Vérifié en local : Source/HouseSource vidées, seed-runtime.js compilé
relancé exactement comme le ferait le conteneur (migrate deploy déjà
appliqué, puis ce script) → les deux sources (TheMealDB, JSON-LD) sont
bien resynchronisées.

Ajoute aussi la couverture Cypress du parcours "sources" qui manquait :
- onboarding.feature : nouveau scénario où le catalogue de sources n'est
  pas vide — l'étape /onboarding/sources s'affiche et se soumet, au lieu
  du seul scénario existant qui la voyait toujours skippée (catalogue
  vide).
- household-settings.feature : nouveaux scénarios pour la section sources
  de /parametres/foyer — affichage + sauvegarde (autosave incluse) quand
  des sources existent, et disparition complète de la section quand le
  catalogue est vide.
- Nouvelles steps partagées (reference-data.steps.ts pour le catalogue,
  household-mutations.steps.ts pour la sélection par foyer).

Non exécutés localement : Chromium/Electron headless plante au lancement
du process GPU dans cet environnement (limitation documentée du README,
reproductible sur main, sans lien avec ce changement) — vérifiés par
relecture attentive contre le code source réel (libellés de traduction,
routes, formes de requête/réponse) et en suivant le même gabarit que les
scénarios existants déjà verts en CI.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 13:48:29 +02:00

43 lines
2 KiB
TypeScript

import { prisma } from "../db/prisma.js";
import { syncRecipeSources } from "../db/recipe-source-sync.js";
import { seedReferenceData } from "../db/reference-seed-data.js";
import { registerAllRecipeSources } from "../sources/index.js";
/**
* Runtime seed entry point for the production Docker image — run via
* `node dist/scripts/seed-runtime.js` in apps/api/Dockerfile's CMD, after
* `prisma migrate deploy` and before starting the server.
*
* Deliberately separate from `prisma/seed.ts` (the dev-time entry point
* wired to `prisma db seed`/`prisma migrate reset`): that one imports
* `seedReferenceData` from `../src/db/...` and runs via `tsx`, but the
* runtime image only ships compiled `dist` output, not `src` (see the
* Dockerfile) — this lives under `src/` instead, so `tsc` compiles it
* alongside everything else, and it runs under plain `node`, no tsx
* needed at runtime.
*
* Also registers and syncs the recipe-source registry
* (`registerAllRecipeSources`/`syncRecipeSources`) — mirroring
* `prisma/seed.ts`'s own two calls. Without this, `server.ts`'s own
* `registerAllRecipeSources()` call only populates *that* process' in-memory
* registry (each `node` invocation in the Docker CMD chain is a separate
* process), so the `Source` table itself would stay permanently empty in
* production and `GET /reference/sources` would always return `[]` — which
* is exactly what silently hid the whole "sources" section of
* `HouseholdSettingsPage` (`apps/web`) until this was added.
*
* Safe to run on every container start: `seedReferenceData` upserts by
* each row's unique name, and `syncRecipeSources` is equally idempotent
* (see its own doc comment) — re-running both against a database that
* already has this data is a no-op.
*/
registerAllRecipeSources();
seedReferenceData(prisma)
.then(() => syncRecipeSources(prisma))
.then(() => prisma.$disconnect())
.catch(async (err) => {
console.error(err);
await prisma.$disconnect();
process.exit(1);
});