fix: update seed documentation to clarify source and process for categories and products
This commit is contained in:
+33
-10
@@ -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.**
|
||||
|
||||
+17
-7
@@ -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:
|
||||
**Körs manuellt på servern:**
|
||||
```bash
|
||||
docker exec -i recipe-db mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" "$MARIADB_DATABASE" \
|
||||
< db/seeds/categories_supplement.sql
|
||||
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
|
||||
```
|
||||
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.
|
||||
|
||||
> **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
|
||||
|
||||
Reference in New Issue
Block a user