Files
recipe-app/NEXT_STEPS.md
T

7.7 KiB
Raw Blame History

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?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:

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)