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>
43 lines
2 KiB
TypeScript
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);
|
|
});
|