Files
recipe-app/NEXT_STEPS.md
T

144 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Nästa steg
> Förslag på vad vi kan ta tag i nästa gång vi öppnar projektet.
> Se [README.md](README.md) för funktionsöversikt och [TEKNISK_BESKRIVNING.md](TEKNISK_BESKRIVNING.md) för teknisk detaljerinformation.
---
## Status — senast genomgånget: 2026-04-17
| Funktion | Status |
|---|---|
| Inventorie (CRUD, konsumtion, historik) | ✅ Klart |
| Recept (skapa, visa, importera, matchning) | ✅ Klart |
| Snabbimport (URL/PDF/bild/ICA) | ✅ Klart |
| 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 |
| Receptredigering (frontend UX) | ✅ Klart |
| Receptbilder (upload URL) | ✅ 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 |
---
## Prioriterade förbättringar
### 1. 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?``Recipe` i Prisma + migration
- **Backend:** `servings` exponeras i `RecipeDto`, sätts vid create/update
- **Frontend (`app/recipes/[id]/`):** räknare (+ / ) bredvid ingredienslistan, beräkning i klientkomponent utan extra API-anrop
- **Receptskapande (`write/`):** lägg till grundportioner-fält
- **Matplan (`app/matplan/`):** inköpslistan justeras efter önskat portionsantal per dag
### 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.
---
## Teknisk skuld och städning
### A. CanonicalNameForm och NameForm — ta bort gamla filer
`frontend/app/admin/products/NameForm.tsx` och `CanonicalNameForm.tsx` ersattes av `EditProductForm.tsx`. Kontrollera om de gamla filerna fortfarande importeras och radera dem om inte.
### B. Oanvända fält på InventoryItem
Följande fält finns i Prisma-schemat men används varken i backend-endpoints eller frontend-UI:
`priority`, `opened`, `shelfNote`, `suitableFor`, `isOnSale`, `priceLevel`, `proteinType`, `isLeftover`
Besluta: implementera stöd för dem eller ta bort via migration.
### C. Seed-data i versionshantering
`data/matvaror_sverige.csv` och `data/seed_products.sql` ligger lokalt men är inte committade. Bestäm om de ska in i repot (för reproducerbarhet) eller hållas utanför.
### D. Enhetstester ✅
Jest + ts-jest är uppsatt. Tester finns för:
- `normalize-name.ts` — 10 tester
- `base.parser.ts` (`parseIngredientLine`) — 12 tester
- `recipes.service.ts` (`normalizeUnit`, `convertUnit`) — 17 tester
Kör med `npm test` i `backend/`.
### E. Validering av DTO:er i admin-actions
Frontend-server-actions saknar validering på inkommande fält (tom sträng, för lång sträng, osv.). Lägg till enkel `trim()` + max-längd-kontroll i `frontend/app/admin/products/actions.ts`.
### F. Routing-städning för kvitto och import
`/kvitto/page.tsx` redirectar till `/import?tab=kvitto`. `/recipes/import/page.tsx` redirectar till `/import?tab=recept`. Om dessa routes inte exponeras i navigeringen kan de tas bort; om de behövs som deep links är redirectarna ok men bör dokumenteras.
---
## 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)