docs: update README, NEXT_STEPS, and technical description for category feature and auth
This commit is contained in:
+25
-73
@@ -15,23 +15,31 @@
|
||||
| Kvittoimport (Mistral AI, OCR, alias) | ✅ Klart |
|
||||
| Matplanering (veckovy, inköpslista) | ✅ Klart |
|
||||
| Baslager (lista, lägg till, ta bort) | ✅ Klart |
|
||||
| Admin: Produkter (edit, merge, duplicate, restore) | ✅ Klart |
|
||||
| Admin: Produkter (edit, merge, duplicate, restore, reset) | ✅ Klart |
|
||||
| Receptredigering (frontend UX) | ✅ Klart |
|
||||
| Receptbilder (upload URL) | ✅ Klart |
|
||||
| Autentisering (JWT, Auth.js v5, User-modell) | ✅ Klart |
|
||||
| Användarprofil (firstName, lastName, email) | ✅ Klart |
|
||||
| Produktkategorier — hierarkisk struktur (3 nivåer) | ✅ Klart |
|
||||
| Taggning av produkter | ✅ Klart |
|
||||
| Näringsvärden på produkter | ✅ Klart (schema + API) |
|
||||
| Kategoritilldelning i admin-UI | ✅ Klart |
|
||||
| Portionsjustering | ❌ Saknas |
|
||||
| Produktkategorier — fast lista | ❌ Saknas |
|
||||
| Receptlista — filtrering & kortvy | ✅ Klart |
|
||||
| Matplan — inventariejämförelse | ❌ Saknas |
|
||||
| Taggning av produkter | ⚠️ Delvis — kräver migration |
|
||||
| Näringsvärden på produkter | ⚠️ Delvis — kräver migration |
|
||||
| Autentisering (User-modell) | ❌ Saknas |
|
||||
| Användarspecifika produkter (UserProduct) | ❌ Saknas — kräver auth |
|
||||
| Seed produktdata med kategoritilldelning | ❌ Saknas (002-seed-products.sql.disabled) |
|
||||
| Användarspecifika produkter (UserProduct) | ⚠️ Schema klart, UI basic |
|
||||
|
||||
---
|
||||
|
||||
## Prioriterade förbättringar
|
||||
|
||||
### 1. Portionsjustering av recept
|
||||
### 1. Seed produktdata med kategoritilldelning
|
||||
`db/init/002-seed-products.sql` är inaktiverad (`.disabled`) tills den uppdateras med rätt `categoryId` för varje produkt. Utan detta är produktdatabasen tom vid fresh install.
|
||||
- Gå igenom de ~190 produkterna och tilldela rätt kategori-ID från tabellen `Category`
|
||||
- Aktivera filen igen genom att ta bort `.disabled`-suffixet
|
||||
- Alternativt: bygg ett admin-verktyg för bulk-kategorisering
|
||||
|
||||
### 2. Portionsjustering av recept
|
||||
Recept lagras utan portionsangivelse. Lägg till ett `servings`-fält och låt användaren justera antal portioner i receptvyn — ingrediensmängderna räknas om proportionellt (t.ex. 4 → 6 pers: × 1,5).
|
||||
- **Databas:** `servings Int?` på `Recipe` i Prisma + migration
|
||||
- **Backend:** `servings` exponeras i `RecipeDto`, sätts vid create/update
|
||||
@@ -42,67 +50,10 @@ Recept lagras utan portionsangivelse. Lägg till ett `servings`-fält och låt a
|
||||
### 3. Matplanering — jämförelse mot inventariet
|
||||
Veckovy och inköpslista fungerar. Nästa steg är att visa vilka ingredienser på inköpslistan som redan finns hemma och i vilken mängd — liknande receptvyns inventory-preview. Implementeras via `GET /api/recipes/:id/inventory-preview` per recept, aggregerat på veckonivå.
|
||||
|
||||
### 4. Produktkategorier — definiera en fast lista
|
||||
Kategorier skrivs in som fritext i admin. Byt till en dropdown med fördefinierade kategorier (t.ex. "Mejeri, ost & ägg", "Kött, chark & fågel", "Frukt & Grönt") för konsistent data och bättre gruppering i baslagervyn.
|
||||
|
||||
### 5. Utökad databas med taggning
|
||||
Lägg till stöd för taggar, underkategorier och varumärke direkt på produkter. Möjliggör filtrering, sökning och rekommendationer baserade på taggar.
|
||||
|
||||
**Schemaändringar (Prisma):**
|
||||
- **`Product`** — lägg till `subcategory String?` och `brand String?` (behåll `canonicalName`)
|
||||
- **`Tag`** — ny modell: `id`, `name @unique`
|
||||
- **`ProductTag`** — ny relationstabell (many-to-many: `Product ↔ Tag`)
|
||||
|
||||
**Implementeringssteg:**
|
||||
1. Uppdatera `backend/prisma/schema.prisma` med nya modeller och relationer
|
||||
2. Kör migration: `docker exec recipe-api npm exec prisma migrate dev --name add_tags_subcategory_brand`
|
||||
3. Skapa seed-fil (`data/seed_tags.sql`) med taggar och kopplingar
|
||||
4. Kör seed-filen mot databasen
|
||||
5. Exponera `tags`, `subcategory`, `brand` i produkt-DTOs och `GET /api/products` (lägg till `?tag=` och `?subcategory=` som filterparametrar)
|
||||
6. Admin: lägg till tagg-hantering och underkategori-fält
|
||||
7. Baslager/produktlista: filtrera per tagg eller underkategori
|
||||
|
||||
**Rekommenderade taggar:** `ekologisk`, `svensk`, `laktosfri`, `glutenfri`, `vegan`, `nötfri`, `säsong`, `rökt`, `premium`, `lamm`, `korv`, `färs`, m.fl.
|
||||
|
||||
### 6. Näringsvärden på produkter
|
||||
Lägg till en `Nutrition`-modell kopplad till `Product` (one-to-one) med näringsvärden per 100g: kalorier, protein, fett, kolhydrater, salt, socker, fiber. Kan implementeras oberoende av autentisering.
|
||||
|
||||
**Schemaändring:**
|
||||
```prisma
|
||||
model Nutrition {
|
||||
id Int @id @default(autoincrement())
|
||||
calories Float?
|
||||
protein Float?
|
||||
fat Float?
|
||||
carbohydrates Float?
|
||||
salt Float?
|
||||
sugar Float?
|
||||
fiber Float?
|
||||
product Product @relation(fields: [productId], references: [id])
|
||||
productId Int @unique
|
||||
}
|
||||
```
|
||||
- **Backend:** CRUD via produktendpoints, exponeras i `ProductDto`
|
||||
- **Frontend:** Visa näringsvärden i produktdetalj och eventuellt i receptvyn (summerat per portion)
|
||||
|
||||
### 7. Autentisering — User-modell
|
||||
Förutsättning för användarspecifika produkter (punkt 10). Idag saknar hela appen autentisering — alla kan CRUD allt.
|
||||
|
||||
**Scope:** JWT-baserad auth med `User`-modell (id, name, email, passwordHash). Berör:
|
||||
- Backend: AuthModule med NestJS Guards, JWT-strategi, skyddade routes
|
||||
- Frontend: Inloggningsflöde, token-hantering i API-anrop
|
||||
- Databas: `User`-tabell + migration
|
||||
|
||||
> ⚠️ Detta är ett stort projekt i sig. Överväg om appen verkligen behöver fler användare eller om enkel HTTP Basic Auth räcker som skydd.
|
||||
|
||||
### 8. Användarspecifika produkter (UserProduct)
|
||||
Låter en användare spara egna produktvarianter med eget namn (t.ex. "Mormors Prästost") kopplade till en standardprodukt — eller fristående utan koppling. Kräver att punkt 9 (auth) är på plats.
|
||||
|
||||
> ⚠️ **Överlapp med InventoryItem:** `InventoryItem` lagrar redan productId, quantity, unit, brand, bestBeforeDate och är i princip en "användarens produkt i lager". Klargör skillnaden:
|
||||
> - `InventoryItem` = vad som finns hemma just nu (lager)
|
||||
> - `UserProduct` = ett eget produktkort/favorit som kan återanvändas utan att vara lager
|
||||
>
|
||||
> Om distinktionen inte är tydlig, riskerar `UserProduct` att duplicera `InventoryItem`-logiken.
|
||||
### 4. Bulk-kategorisering av produkter i admin
|
||||
Admin-UI:t tillåter idag att sätta kategori per produkt. För att effektivt kategorisera hundratals produkter behövs:
|
||||
- Filtervy för okategoriserade produkter
|
||||
- Möjlighet att sätta kategori på flera produkter samtidigt (bulk-select)
|
||||
|
||||
---
|
||||
|
||||
@@ -137,7 +88,8 @@ Frontend-server-actions saknar validering på inkommande fält (tom sträng, fö
|
||||
|
||||
## Produktdatabasen
|
||||
|
||||
193 svenska produkter är inseedad. Nästa naturliga steg:
|
||||
- Lägg till fler saknade produkter som dyker upp vid receptimport
|
||||
- Gå igenom produkter utan `canonicalName` i admin och fyll i dem
|
||||
- Kontrollera att `category` är ifyllt för alla produkter (för bättre gruppering i baslager)
|
||||
Produktdatabasen är just nu tom — seedfilen `db/init/002-seed-products.sql.disabled` innehåller ~190 svenska baslivsmedel men är inaktiverad tills produkterna har tilldelats rätt `categoryId`. Nästa naturliga steg:
|
||||
- Gå igenom produkterna och tilldela kategorier via admin-UI eller uppdatera seed-filen direkt
|
||||
- Aktivera seed-filen igen (`002-seed-products.sql`) för reproducerbarhet vid fresh install
|
||||
- Lägg till fler produkter som dyker upp vid receptimport
|
||||
- Kontrollera att `canonicalName` är ifyllt för alla produkter
|
||||
|
||||
Reference in New Issue
Block a user