Répond au besoin identifié précédemment : la table `sources` devient un vrai catalogue des sources implémentées, et une recette importée pourra être reliée à l'item source dont elle provient. - Source.key (unique) — même convention que Diet.key/Unit.key/ TechStep.key. Le catalogue est désormais synchronisé depuis le registre d'adaptateurs (recipe-source-registry.ts) via syncRecipeSources() (nouveau apps/api/src/db/recipe-source-sync.ts), plutôt que maintenu à la main comme DIETS/UNITS — reste vide tant qu'aucun adaptateur concret n'est enregistré. - Recipe.externalId (nullable) — l'identifiant de la recette côté source. Contrainte @@unique([sourceId, externalId]) : empêche d'importer deux fois la même recette (les recettes manuelles, aux deux colonnes nulles, ne sont jamais en conflit entre elles). - findImportedExternalIds(prisma, sourceKey, externalIds) — le pendant DB de markAlreadyImported (recipe-source-adapter.ts), ferme la boucle commencée dans la PR précédente pour distinguer les recettes déjà intégrées lors du browse. - syncRecipeSources() appelé après seedReferenceData() dans prisma/seed.ts et test-support/reset-db.ts. Toujours pas de route HTTP ni de champ sourceId/externalId exposé dans createRecipeSchema — la sauvegarde effective d'une recette importée reste pour une PR ultérieure. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
24 lines
1 KiB
SQL
24 lines
1 KiB
SQL
-- Adds `Source.key` (`key String @unique`) — the catalog of implemented
|
|
-- recipe sources is now kept in sync with the adapter registry
|
|
-- (recipe-source-registry.ts) by key, same "stable English camelCase uid"
|
|
-- convention as Diet/Unit/TechStep, rather than hand-maintained. `sources`
|
|
-- has never been seeded (no rows exist pre-launch), so a plain NOT NULL
|
|
-- column with no backfill is safe.
|
|
--
|
|
-- Adds `Recipe.external_id` — the item's identifier on `source`, `null`
|
|
-- for a manually-authored recipe. `@@unique([sourceId, externalId])`
|
|
-- prevents importing the same source recipe twice; Postgres treats each
|
|
-- NULL as distinct, so manually-authored recipes (both columns null) never
|
|
-- collide with each other or with one another here.
|
|
|
|
-- AlterTable
|
|
ALTER TABLE "sources" ADD COLUMN "key" TEXT NOT NULL;
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "sources_key_key" ON "sources"("key");
|
|
|
|
-- AlterTable
|
|
ALTER TABLE "recipe" ADD COLUMN "external_id" TEXT;
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "recipe_source_id_external_id_key" ON "recipe"("source_id", "external_id");
|