114 lines
5.7 KiB
Markdown
114 lines
5.7 KiB
Markdown
# 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-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) | ❌ Saknas |
|
|
| Användarhantering i admin-UI | ❌ Saknas |
|
|
| 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
|
|
**Mål:** Säkerställa att endast behöriga användare har admin-rättigheter.
|
|
|
|
Idag har alla inloggade användare samma behörighetsnivå — ett säkerhetsproblem inför lansering.
|
|
- **Databas:** Lägg till `role` (enum `user` | `admin`) på `User`-modellen i Prisma + migration
|
|
- **Backend:** Rollbaserad guard (`@Roles('admin')`) — skyddar admin-endpoints; vanliga användare nekas med 403
|
|
- **Auth:** Rollen inkluderas i JWT-tokenen och i Auth.js session-objektet
|
|
- **Frontend — admin-UI (`/admin/users/`):** Lista användare, skapa nya konton (namn, e-post, lösenord, roll), ändra roll, avaktivera konto
|
|
- **Frontend — skyddade routes:** `/admin/*` kräver admin-roll; omdirigerar annars till startsidan
|
|
|
|
### 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/`.
|