docs: uppdatera README/TEKNISK_BESKRIVNING och lagg till NEXT_STEPS

This commit is contained in:
Nils-Johan Gynther
2026-04-15 22:19:37 +02:00
parent 719c291e36
commit 3f6d32ae44
3 changed files with 95 additions and 8 deletions
+51
View File
@@ -0,0 +1,51 @@
# 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.
---
## Prioriterade förbättringar
### 1. Receptredigering fungerar fullt ut
Recept kan nu sparas men det finns inte stöd för att redigera ett befintligt recept (inklusive ingredienser). Kontrollera och testa `PATCH /api/recipes/:id` och frontend-vyn under `app/recipes/[id]/`.
### 2. Baslager kopplat mot inventariet
Just nu är baslager och inventariet separata. En naturlig nästa steg är att visa en indikator i baslagerlistan för vilka produkter som faktiskt finns i inventariet just nu — och med hur mycket.
### 3. Produktkategorier — definiera en fast lista
Kategorier skrivs in fritt i admin i dag. Det vore bättre med en dropdownlista med fördefinierade kategorier (t.ex. "Mejeri", "Kött & Fisk", "Torrvaror", osv.) för att hålla konsistens i datan och förbättra grupperingen i baslager-vyn.
### 4. Bild på recept
`imageUrl`-kolumnen finns i databasen (migrerad). Backend och frontend saknar stöd för att visa eller ladda upp receptbilder.
### 5. Matplanering
Lägg till en enkel veckomenylista: välj ett recept per dag, se en samlad ingredienslista och jämför mot inventariet. Kräver en ny `MealPlan`-modell i Prisma.
---
## 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. 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.
### C. Enhetstester
Inga tester finns i dag. Kandidater:
- `normalize-name.ts` (ren funktion, lätt att testa)
- Matchningsalgoritmen i `recipes.service.ts`
- Parser-logiken i `base.parser.ts`
### D. 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`.
---
## 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)
+8 -1
View File
@@ -3,6 +3,7 @@
En fullstack-applikation för hantering av hemmavaror och recept. Håll koll på vad du har hemma, spara recept och se direkt om du har allt du behöver för att laga en rätt. En fullstack-applikation för hantering av hemmavaror och recept. Håll koll på vad du har hemma, spara recept och se direkt om du har allt du behöver för att laga en rätt.
> För teknisk detaljinformation, se [TEKNISK_BESKRIVNING.md](TEKNISK_BESKRIVNING.md). > För teknisk detaljinformation, se [TEKNISK_BESKRIVNING.md](TEKNISK_BESKRIVNING.md).
> För förslag på nästa steg i projektet, se [NEXT_STEPS.md](NEXT_STEPS.md).
--- ---
@@ -23,8 +24,14 @@ En fullstack-applikation för hantering av hemmavaror och recept. Håll koll på
- **Intelligenta matchningar** — Levenshtein-baserad likhetsbedömning hittar rätt produkt även på osäker stavning - **Intelligenta matchningar** — Levenshtein-baserad likhetsbedömning hittar rätt produkt även på osäker stavning
- **Enhetskonvertering** — automatisk konvertering mellan viktenheter (g/kg), volymenheter (ml/dl) och portionsenheter (tsk/msk) - **Enhetskonvertering** — automatisk konvertering mellan viktenheter (g/kg), volymenheter (ml/dl) och portionsenheter (tsk/msk)
### Baslager
- **Ständigt lager** — markera produkter du alltid räknar med att ha hemma
- **Grupperat per kategori** — produkterna i baslagret visas grupperade
- **Lägg till och ta bort** — välj från produktlistan via dropdown, ta bort med ett klick
### Admin: Produkter ### Admin: Produkter
- **Hantera produktnamn** — uppdatera canonical name för varje produkt (användes vid receptmatchning) - **Redigera produkter** — uppdatera visningsnamn (name), canonical name och kategori inline direkt i listan
- **Ta bort produkter** — soft-delete enskilda produkter
- **Hitta dubbletter** — identifiera produkter med samma normaliserade namn - **Hitta dubbletter** — identifiera produkter med samma normaliserade namn
- **Slå ihop produkter** — merge två produktposter, flytta alla inventarieföremål till målprodukten (källan soft-deleteras) - **Slå ihop produkter** — merge två produktposter, flytta alla inventarieföremål till målprodukten (källan soft-deleteras)
- **Förhandsvisning** — granska vad som kommer att hända innan merge genomförs - **Förhandsvisning** — granska vad som kommer att hända innan merge genomförs
+34 -5
View File
@@ -1,6 +1,7 @@
# Teknisk beskrivning av Recipe App # Teknisk beskrivning av Recipe App
> Se [README.md](README.md) för användarinformation och kom-igång-guide. > Se [README.md](README.md) för användarinformation och kom-igång-guide.
> Se [NEXT_STEPS.md](NEXT_STEPS.md) för förslag på nästa steg i projektet.
## Översikt ## Översikt
@@ -67,9 +68,13 @@ Recipe App är en fullstack-applikation för hantering av hemmavaror, recept och
| **Recipe detail** | `app/recipes/[id]/` | Enskilt recept (detaljer, redigering) | | **Recipe detail** | `app/recipes/[id]/` | Enskilt recept (detaljer, redigering) |
| **Admin: Produkter** | `app/admin/products/page.tsx` | Produktadmin-panel | | **Admin: Produkter** | `app/admin/products/page.tsx` | Produktadmin-panel |
| | `AdminProductList.tsx` | Lista produkter, sök, sortera | | | `AdminProductList.tsx` | Lista produkter, sök, sortera |
| | `NameForm.tsx` | Redigera produktnamn | | | `EditProductForm.tsx` | Inline redigering av name, canonicalName, category + soft-delete |
| | `CanonicalNameForm.tsx` | Redigera canonical name |
| | `MergePreviewForm.tsx` | Förhandsgranska merge | | | `MergePreviewForm.tsx` | Förhandsgranska merge |
| | `actions.ts` | Server actions: updateProduct, deleteProduct |
| **Baslager** | `app/baslager/page.tsx` | Visa och hantera baslager (server component) |
| | `AddToPantryForm.tsx` | Lägg till produkt i baslager (dropdown) |
| | `PantryList.tsx` | Visa baslager grupperat per kategori |
| | `actions.ts` | Server actions: addPantryItem, removePantryItem |
### API-proxy routes (Next.js) ### API-proxy routes (Next.js)
@@ -81,6 +86,7 @@ Recipe App är en fullstack-applikation för hantering av hemmavaror, recept och
| `/api/recipe-preview-proxy` | GET | Proxies receptförhandsvisning | | `/api/recipe-preview-proxy` | GET | Proxies receptförhandsvisning |
| `/api/admin/merge-preview-proxy` | GET | Proxies produktmerge-preview | | `/api/admin/merge-preview-proxy` | GET | Proxies produktmerge-preview |
| `/api/products` | GET | Lista/proxies produkter | | `/api/products` | GET | Lista/proxies produkter |
| `/api/recipes` | GET, POST | Lista recept + spara nytt recept (proxy till backend) |
### Frontend utbyggbarhet ### Frontend utbyggbarhet
@@ -150,8 +156,12 @@ backend/src/
└── dto/ └── dto/
├── create-recipe.dto.ts ├── create-recipe.dto.ts
├── parse-markdown.dto.ts ├── parse-markdown.dto.ts
└── create-recipe-ingredient.dto.ts └── create-recipe-ingredient.dto.ts└── pantry/
``` ├── pantry.controller.ts # GET/POST/DELETE /api/pantry
├── pantry.service.ts # Baslagerlogik
├── pantry.module.ts
└── dto/
└── create-pantry-item.dto.ts```
### Backend-funktioner ### Backend-funktioner
@@ -258,7 +268,7 @@ GET /api/recipes/:id/inventory-preview Jämför recept mot inventarie
GET /api/products Lista alla aktiva produkter GET /api/products Lista alla aktiva produkter
POST /api/products Skapa ny produkt POST /api/products Skapa ny produkt
GET /api/products/:id Hämta specifik produkt GET /api/products/:id Hämta specifik produkt
PATCH /api/products/:id Uppdatera produktens namn PATCH /api/products/:id Uppdatera produktens namn, canonicalName eller kategori
DELETE /api/products/:id Soft-delete produkt DELETE /api/products/:id Soft-delete produkt
POST /api/products/:id/restore Återställ raderad produkt POST /api/products/:id/restore Återställ raderad produkt
@@ -270,6 +280,13 @@ PATCH /api/products/:id/canonical-name Uppdatera canonical name
POST /api/products/backfill-canonical Backfill canonical names (admin) POST /api/products/backfill-canonical Backfill canonical names (admin)
``` ```
### 🛀 Baslager-endpoints
```
GET /api/pantry Lista alla baslagerartiklar (inkl. produktinfo)
POST /api/pantry Lägg till produkt i baslagret
DELETE /api/pantry/:id Ta bort produkt från baslagret
```
--- ---
## Datamodell (Prisma ORM) ## Datamodell (Prisma ORM)
@@ -366,6 +383,18 @@ model RecipeIngredient {
} }
``` ```
### PantryItem
```prisma
model PantryItem {
id Int @id @default(autoincrement())
productId Int @unique # En produkt kan bara finnas en gång i baslagret
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
product Product @relation(fields: [productId], references: [id], onDelete: Cascade)
}
```
--- ---
## Receptimport och receptskaping — Detaljerad arkitektur ## Receptimport och receptskaping — Detaljerad arkitektur