batchCooking/apps/api/prisma/migrations/20260816100611_init/migration.sql
Nicolas c957db27df Add Prisma schema for the documented data model
Models every table from specs/batch-cooking-modele.md: users/household
(user_profiles, house, diet, allergy, category), planning (planning,
planning_item), and recipes (recipe, ingredients, step, tech_step,
tech_step_mapping, sources).

Two deliberate deviations from the literal spec doc, per project
discussion:

- recipe_ingredient (recipe <-> ingredients) carries quantity + unit.
  The spec describes a plain many-to-many with no extra fields, but a
  shopping list / batch-cooking calculation needs quantities.
- step is modeled one-to-many from recipe (not many-to-many as labeled
  in the doc): the documented `order` column only makes sense scoped
  to a single recipe, which isn't reconcilable with steps being
  shared across recipes.

Everything else follows the doc as-is, including field nullability
choices made where the doc doesn't specify (e.g. user_profiles.house_id
optional, recipe.source_id optional) and onDelete behavior (Cascade
for owned child records, SetNull for optional references) — first
draft, not meant as final production hardening.

Verified: `prisma validate`, `prisma generate`, and a real
`prisma migrate dev` against a local Postgres (via docker-compose) —
the migration applies cleanly and produces the expected schema.

README: documents the migrate command and a Postgres port-conflict
gotcha hit during validation (a native Postgres service on this
machine was already bound to 5432, intercepting the Docker container's
connections).
2026-08-16 12:09:20 +02:00

189 lines
5.7 KiB
SQL

-- CreateTable
CREATE TABLE "house" (
"id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
CONSTRAINT "house_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "diet" (
"id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
CONSTRAINT "diet_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "category" (
"id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
CONSTRAINT "category_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "allergy" (
"id" SERIAL NOT NULL,
"cat_id" INTEGER NOT NULL,
CONSTRAINT "allergy_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "user_profiles" (
"id" SERIAL NOT NULL,
"first_name" TEXT NOT NULL,
"last_name" TEXT NOT NULL,
"email" TEXT NOT NULL,
"house_id" INTEGER,
"diet_id" INTEGER,
CONSTRAINT "user_profiles_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "user_profile_allergy" (
"user_profile_id" INTEGER NOT NULL,
"allergy_id" INTEGER NOT NULL,
CONSTRAINT "user_profile_allergy_pkey" PRIMARY KEY ("user_profile_id","allergy_id")
);
-- CreateTable
CREATE TABLE "planning" (
"id" SERIAL NOT NULL,
"start_date" DATE NOT NULL,
"finish_date" DATE NOT NULL,
"house_id" INTEGER NOT NULL,
CONSTRAINT "planning_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "planning_item" (
"id" SERIAL NOT NULL,
"planning_id" INTEGER NOT NULL,
"week_day" TEXT NOT NULL,
"meal" TEXT NOT NULL,
"recipe_id" INTEGER NOT NULL,
CONSTRAINT "planning_item_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "sources" (
"id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
"url" TEXT,
CONSTRAINT "sources_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "recipe" (
"id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
"source_id" INTEGER,
"description" TEXT,
"picture" TEXT,
CONSTRAINT "recipe_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "ingredients" (
"id" SERIAL NOT NULL,
"name" TEXT NOT NULL,
"icon" TEXT,
"alternate_recipe" INTEGER,
CONSTRAINT "ingredients_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "recipe_ingredient" (
"recipe_id" INTEGER NOT NULL,
"ingredient_id" INTEGER NOT NULL,
"quantity" DECIMAL(10,2) NOT NULL,
"unit" TEXT NOT NULL,
CONSTRAINT "recipe_ingredient_pkey" PRIMARY KEY ("recipe_id","ingredient_id")
);
-- CreateTable
CREATE TABLE "tech_step" (
"id" SERIAL NOT NULL,
CONSTRAINT "tech_step_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "tech_step_mapping" (
"id" SERIAL NOT NULL,
"tech_step_id" INTEGER NOT NULL,
"expression" TEXT NOT NULL,
"weight" INTEGER NOT NULL,
CONSTRAINT "tech_step_mapping_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "step" (
"id" SERIAL NOT NULL,
"recipe_id" INTEGER NOT NULL,
"description" TEXT NOT NULL,
"picture" TEXT,
"order" INTEGER NOT NULL,
"tech_step_id" INTEGER,
CONSTRAINT "step_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "user_profiles_email_key" ON "user_profiles"("email");
-- AddForeignKey
ALTER TABLE "allergy" ADD CONSTRAINT "allergy_cat_id_fkey" FOREIGN KEY ("cat_id") REFERENCES "category"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "user_profiles" ADD CONSTRAINT "user_profiles_house_id_fkey" FOREIGN KEY ("house_id") REFERENCES "house"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "user_profiles" ADD CONSTRAINT "user_profiles_diet_id_fkey" FOREIGN KEY ("diet_id") REFERENCES "diet"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "user_profile_allergy" ADD CONSTRAINT "user_profile_allergy_user_profile_id_fkey" FOREIGN KEY ("user_profile_id") REFERENCES "user_profiles"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "user_profile_allergy" ADD CONSTRAINT "user_profile_allergy_allergy_id_fkey" FOREIGN KEY ("allergy_id") REFERENCES "allergy"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "planning" ADD CONSTRAINT "planning_house_id_fkey" FOREIGN KEY ("house_id") REFERENCES "house"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "planning_item" ADD CONSTRAINT "planning_item_planning_id_fkey" FOREIGN KEY ("planning_id") REFERENCES "planning"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "planning_item" ADD CONSTRAINT "planning_item_recipe_id_fkey" FOREIGN KEY ("recipe_id") REFERENCES "recipe"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "recipe" ADD CONSTRAINT "recipe_source_id_fkey" FOREIGN KEY ("source_id") REFERENCES "sources"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "ingredients" ADD CONSTRAINT "ingredients_alternate_recipe_fkey" FOREIGN KEY ("alternate_recipe") REFERENCES "recipe"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "recipe_ingredient" ADD CONSTRAINT "recipe_ingredient_recipe_id_fkey" FOREIGN KEY ("recipe_id") REFERENCES "recipe"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "recipe_ingredient" ADD CONSTRAINT "recipe_ingredient_ingredient_id_fkey" FOREIGN KEY ("ingredient_id") REFERENCES "ingredients"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "tech_step_mapping" ADD CONSTRAINT "tech_step_mapping_tech_step_id_fkey" FOREIGN KEY ("tech_step_id") REFERENCES "tech_step"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "step" ADD CONSTRAINT "step_recipe_id_fkey" FOREIGN KEY ("recipe_id") REFERENCES "recipe"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "step" ADD CONSTRAINT "step_tech_step_id_fkey" FOREIGN KEY ("tech_step_id") REFERENCES "tech_step"("id") ON DELETE SET NULL ON UPDATE CASCADE;