From 1131745666606609c9f948844920f1683b7153a9 Mon Sep 17 00:00:00 2001 From: Nils-Johan Gynther Date: Sun, 19 Apr 2026 23:21:46 +0200 Subject: [PATCH] fix: update seed documentation to clarify source and process for categories and products --- NEXT_STEPS.md | 43 ++++++++++++++++++++++++++++++++---------- TEKNISK_BESKRIVNING.md | 28 ++++++++++++++++++--------- 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/NEXT_STEPS.md b/NEXT_STEPS.md index cd837849..fedbc30b 100644 --- a/NEXT_STEPS.md +++ b/NEXT_STEPS.md @@ -29,11 +29,11 @@ | SessionProvider i root layout | ✅ Klart | | Användarprofil (firstName, lastName, email) | ✅ Klart | | Produktkategorier — hierarkisk struktur (3 nivåer) | ✅ Klart | -| Kategori-seed (supplement, idempotent) | ✅ Klart | +| Kategori-seed (seed_all.sql, komplett träd, enda sanningskällan) | ✅ Klart | | Kategoritilldelning i admin-UI | ✅ Klart | | Taggning av produkter | ✅ Klart | | Näringsvärden på produkter | ✅ Klart (schema + API) | -| Seed produktdata med kategoritilldelning | ⚠️ Script klart, ej aktiverat i init | +| Seed produktdata med kategoritilldelning | ✅ Klart (seed_all.sql) | | Användarspecifika produkter (UserProduct) | ⚠️ Schema klart, UI basic | | Användarroller (user / admin) | ✅ Klart | | Användarhantering i admin-UI | ✅ Klart | @@ -54,15 +54,38 @@ ## Prioriterade förbättringar -### 1. Seed-data (002-seed-products.sql) -**Mål:** Möjliggöra demo och ny server utan manuell datainmatning. +### 1. ICA-skraparen missar receptbild +**Problem:** Vid import av ICA-recept via URL hämtas inte receptbilden korrekt. -`db/init/002-seed-products.sql` är inaktiverad (`.disabled`) tills produkterna har rätt `categoryId`. Skript för kategorimappning finns i `db/seeds/`: -- Kör `db/seeds/categories_supplement.sql` → lägger till saknade kategorier -- Kör `db/seeds/seed_product_categories.sql` → kopplar ~190 produkter till rätt kategori -- Verifiera att mappningarna ser rätt ut i admin-UI (filtrera på okategoriserade) -- Generera en ny `002-seed-products.sql` med korrekt `categoryId` per rad (via `SELECT` mot live-db) -- Ta bort `.disabled`-suffixet och testa fresh install +- Felsök parsern i `recipe-document-converter/src/parser.ts` — kontrollera att ICA:s bild-selektor fortfarande matchar sidans HTML-struktur +- ICA kan ha ändrat klassnamn eller lazy-load-mekanism sedan skraparen skrevs +- Verifiera med ett konkret ICA-recept-URL och logga vad `imageUrl` returnerar + +### 2. Seed-data ✅ +**Klart.** `db/seeds/seed_all.sql` är den enda sanningskällan för kategorier och produkter. + +Filen: +- TRUNCATEar `Category` och nollställer `Product.categoryId` +- Bygger hela kategoriträdet (nivå 1–3) utan dubbletter +- Insertar ~190 produkter (INSERT IGNORE) +- Kopplar produkterna till rätt kategori via JOIN-subqueries + +Körs manuellt: `docker exec -i recipe-db mariadb -uroot -p"$DB_PASS" recipe_app < db/seeds/seed_all.sql` + +### 2. Refactor: seed_all.sql som del av fresh install +**Mål:** Fresh install ska inte kräva ett manuellt seed-steg. + +Nuläge: +- `db/init/001-init.sql` (MariaDB auto-init) skapar bara en bootstrap-check-tabell +- Prisma-migrationen `20260417310000_add_category_tree` seedar kategorier en gång, men seed_all.sql skriver över dem +- `seed_all.sql` körs **inte** automatiskt vid deploy eller fresh install + +Alternativ: +- **Alt A:** Flytta seed_all.sql-logiken till `db/init/001-init.sql` — körs automatiskt av MariaDB-containern vid första start +- **Alt B:** Skapa en `prisma/seed.ts` som körs via `prisma db seed` — standard NestJS/Prisma-mönster, kan inkluderas i deploy.sh +- **Alt C:** Lägg till `seed_all.sql` som ett steg i `deploy.sh` (körs alltid, idempotent p.g.a. TRUNCATE+INSERT IGNORE) + +Oavsett alternativ bör de gamla kategori-INSERTs i `20260417310000_add_category_tree/migration.sql` tas bort eller kommenteras ur för att undvika förvirring. ### 2. Användarroller och full användarhantering ✅ **Klart.** diff --git a/TEKNISK_BESKRIVNING.md b/TEKNISK_BESKRIVNING.md index b5cea212..e473867c 100644 --- a/TEKNISK_BESKRIVNING.md +++ b/TEKNISK_BESKRIVNING.md @@ -664,18 +664,28 @@ model Category { Hierarkin har 3 nivåer: **Huvudkategori → Underkategori → Typ** Exempelträd: `Mejeri, ost & ägg → Mjölk → Laktosfri mjölk` -#### Kategori-seed +#### Kategori- och produktseed -Kategorier seedas på två sätt: +All seed-data för kategorier och produkter hanteras av **`db/seeds/seed_all.sql`** — den enda sanningskällan. -1. **Migrationen** `20260417310000_add_category_tree/migration.sql` — seedar grundläggande kategorier vid `prisma migrate deploy` (körs bara en gång). +**Vad filen gör:** +1. **TRUNCATE `Category`** + nollställer `Product.categoryId` — rensar alla ev. gamla/duplicerade kategorier +2. **Bygger upp hela kategoriträdet** (nivå 1–3) med rena `INSERT` — exakt en rad per kategori, inga dubbletter möjliga +3. **`INSERT IGNORE` ~190 produkter** — hoppar över produkter som redan finns +4. **`UPDATE Product SET categoryId`** — kopplar produkterna till rätt kategori via JOIN-subqueries -2. **`db/seeds/categories_supplement.sql`** — idempotent supplementfil med ytterligare kategorier (använder `INSERT IGNORE`). Körs automatiskt av `deploy.sh` vid varje deploy: - ```bash - docker exec -i recipe-db mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" "$MARIADB_DATABASE" \ - < db/seeds/categories_supplement.sql - ``` - Filen är säker att köra flera gånger — befintliga kategorier hoppas över. Lägg till nya kategorier i slutet av filen och kör `deploy.sh` för att applicera dem. +**Körs manuellt på servern:** +```bash +DB_PASS=$(grep MARIADB_ROOT_PASSWORD .env | cut -d= -f2) +docker exec -i recipe-db mariadb -uroot -p"$DB_PASS" recipe_app < db/seeds/seed_all.sql +``` + +> **OBS:** Migrationen `20260417310000_add_category_tree/migration.sql` innehåller fortfarande gamla kategori-INSERTs från ursprungsimplementationen. Dessa kör en gång vid `prisma migrate deploy` men seed_all.sql nollställer och skriver över dem vid nästa körning. Se NEXT_STEPS.md för planerat refactor-arbete. + +> **OBS:** Om `InventoryItem`-rader pekar på produkter som inte längre finns (t.ex. efter TRUNCATE av Product) uppstår Prisma-felet "Field product is required". Rensa orphan-rader med: +> ```sql +> DELETE FROM InventoryItem WHERE productId NOT IN (SELECT id FROM Product); +> ``` ### Product ```prisma