7.7 KiB
Nästa steg
Förslag på vad vi kan ta tag i nästa gång vi öppnar projektet.
Se README.md för funktionsöversikt och 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?påRecipei Prisma + migration - Backend:
servingsexponeras iRecipeDto, 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 tillsubcategory String?ochbrand String?(behållcanonicalName)Tag— ny modell:id,name @uniqueProductTag— ny relationstabell (many-to-many:Product ↔ Tag)
Implementeringssteg:
- Uppdatera
backend/prisma/schema.prismamed nya modeller och relationer - Kör migration:
docker exec recipe-api npm exec prisma migrate dev --name add_tags_subcategory_brand - Skapa seed-fil (
data/seed_tags.sql) med taggar och kopplingar - Kör seed-filen mot databasen
- Exponera
tags,subcategory,brandi produkt-DTOs ochGET /api/products(lägg till?tag=och?subcategory=som filterparametrar) - Admin: lägg till tagg-hantering och underkategori-fält
- 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:
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:
InventoryItemlagrar 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 lagerOm distinktionen inte är tydlig, riskerar
UserProductatt dupliceraInventoryItem-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 testerbase.parser.ts(parseIngredientLine) — 12 testerrecipes.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
canonicalNamei admin och fyll i dem - Kontrollera att
categoryär ifyllt för alla produkter (för bättre gruppering i baslager)