Files
recipe-app/NEXT_STEPS.md
T

6.5 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-18

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
Matplan — portionsjustering per dag Klart
Matplan — inventariejämförelse (backend) Klart
Matplan — inventariejämförelse (frontend-vy) Klart (/⚠️/ integrerat i inköpslistan)
Baslager (lista, lägg till, ta bort) Klart
Admin: Produkter (edit, merge, duplicate, restore, reset) Klart
Admin: Bulk-kategorisering 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
Kategori-seed (supplement, idempotent) Klart
Kategoritilldelning i admin-UI Klart
Taggning av produkter Klart
Näringsvärden på produkter Klart (schema + API)
Seed produktdata med kategoritilldelning ⚠️ Script klart, ej aktiverat i init
Användarspecifika produkter (UserProduct) ⚠️ Schema klart, UI basic
Användarroller (user / admin) Klart
Användarhantering i admin-UI Klart
Teknisk skuld — oanvända InventoryItem-fält Klart (migration 20260418)
Teknisk skuld — redirect-routes städade Klart
Avancerad AI-integration (veckoplanering, kampanjdata) Planerad

Prioriterade förbättringar

1. Seed-data (002-seed-products.sql)

Mål: Möjliggöra demo och ny server utan manuell datainmatning.

db/init/002-seed-products.sql är inaktiverad (.disabled) tills produkterna har rätt categoryId. Skript för kategorimappning finns i db/seeds/:

  • Kör db/seeds/categories_supplement.sql → lägger till saknade kategorier
  • Kör db/seeds/seed_product_categories.sql → kopplar ~190 produkter till rätt kategori
  • Verifiera att mappningarna ser rätt ut i admin-UI (filtrera på okategoriserade)
  • Generera en ny 002-seed-products.sql med korrekt categoryId per rad (via SELECT mot live-db)
  • Ta bort .disabled-suffixet och testa fresh install

2. Användarroller

Klart.

Systemet har nu fullständig rollbaserad åtkomstkontroll med två roller: user (standard) och admin.

Vad som implementerades:

  • Prisma-migration (20260418100000_add_user_role) — fältet role String @default("user") lades till på User-modellen
  • @Roles('admin')-dekoratorn (auth/decorators/roles.decorator.ts) — använder SetMetadata för att markera endpoints
  • RolesGuard (auth/roles.guard.ts) — registrerad globalt som APP_GUARD; läser rollmetadata, kastar 403 om rätt roll saknas
  • JWT inkluderar nu rolejwt.strategy.ts returnerar {userId, username, role}, auth.service.ts signerar med role i payload
  • Bootstrap-användare (users/admin-bootstrap.service.ts) — OnApplicationBootstrap skapar/uppdaterar Nadmin, Padmin, user1 och user2 vid varje uppstart via miljövariabler
  • Skyddade produkt-endpoints@Roles('admin')merge, delete, restore, reset-all, bulk-update, backfill-canonical i products.controller.ts
  • Användarhantering-APIGET /api/users och PATCH /api/users/:id/role (båda kräver admin-roll)
  • Frontend-sessionauth.ts sparar role i JWT och session; types/next-auth.d.ts utgör typdefinition
  • Proxy-skyddproxy.ts blockerar /admin/* för användare utan admin-roll
  • Admin-UI/admin/users med tabell och rollbyteskäppar; länken "👥 Användare" i navigeringen visas enbart för admins
  • API-proxiesapp/api/admin-users/route.ts och app/api/admin-users/[id]/route.ts vidarebefordrar anrop med auth-header

3. Matplan-vy (frontend-polish)

Klart.

Inköpslistan och inventariejämförelsen är sammanslagna till en enhetlig vy med tre statusnivåer:

  • Saknas helt — visar hur mycket som behövs köpas
  • ⚠️ Delvis hemma — visar hur mycket mer som behövs + vad som finns
  • Finns hemma — markeras nedtonat, ingen köpindikering

Listan sorteras automatiskt: saknade ingredienser överst, hemma-ingredienser underst. En sammanfattningsrad visar totalt antal per statuskategori.

4. Teknisk skuld (underhåll)

Mål: Minska komplexitet och risk för buggar.

A. CanonicalNameForm och NameForm

Filerna var redan borttagna — inga aktiva imports hittades. Inget att göra.

B. Oanvända fält på InventoryItem

Följande 6 fält togs bort via Prisma-migration (20260418000000_remove_unused_inventory_fields): priority, shelfNote, isOnSale, priceLevel, proteinType, isLeftover

  • Schema, DTOs (create + update), service och frontend-typen är städade.
  • opened och suitableFor behölls — de används i UI.

C. Validering av DTO:er i admin-actions

Redan implementerat — trim() + max 100 tecken på alla fält i actions.ts. Inget att göra.

D. Routing-städning för kvitto och import

frontend/app/kvitto/page.tsx och frontend/app/recipes/import/page.tsx är borttagna. /import täcker båda use-cases via flikar.

E. Seed-data i versionshantering

data/matvaror_sverige.csv och data/seed_products.sql behålls i git för reproducerbarhet. Inga ändringar i .gitignore.

5. Avancerad AI-integration

Mål: Smarta receptförslag och veckoplanering baserat på inventarie och kampanjdata.

Nuvarande AI-funktionalitet (Mistral för kvittotolkning) är ett bra fundament. Nästa steg:

  • Receptförslag utifrån vad som finns hemma ("Vad ska jag laga idag?")
  • Veckoplanering med hänsyn till kampanjpriser (kräver extern datakälla)
  • Kräver: tydlig API-design, kostnadskontroll och eventuellt modellval per use-case

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