Files
recipe-app/NEXT_STEPS.md
T

6.6 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) ⚠️ Delvis
Receptbilder (upload UI) ⚠️ Delvis
Portionsjustering Saknas
Produktkategorier — fast lista Saknas
Receptlista — filtrering & kortvy Saknas
Matplan — inventariejämförelse Saknas
Taggning av produkter Saknas

Prioriterade förbättringar

1. Receptredigering — verifiera och slutför frontend-flödet

Backend (PATCH /api/recipes/:id) är fullt implementerat och hanterar namn, beskrivning, instruktioner, imageUrl och ingredienser. Redigeringskoden i app/recipes/[id]/RecipeDetailClient.tsx finns men flödet för spara/avbryt behöver verifieras och eventuellt slutföras. /recipes/[id]/edit/page.tsx redirectar i dag tillbaka till detaljsidan — ta bort den omdirigering om redigering sker inline.

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?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. Receptbilder — upload-UI i frontend

Backend har POST /api/recipes/:id/image som tar emot en URL, laddar ner och optimerar bilden. imageUrl finns i databasen och formuläret i write/WriteRecipePage.tsx har redan ett imageUrl-fält. Saknas: ett upload-flöde eller URL-inmatning med förhandsgranskning i receptdetaljvyn (app/recipes/[id]/RecipeDetailClient.tsx).

6. Filtrering och kortvy för receptlistan

Receptlistan (app/recipes/RecipeGrid.tsx) är en platt lista utan filter. Lägg till:

  • Söka på namn — klientside
  • Sortera på namn A–Ö eller senast tillagd — klientside
  • Kortrutnät med receptbild, namn och eventuellt portionsantal (efter att #2 är klar)

7. 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.


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)