docs: uppdatera README/TEKNISK_BESKRIVNING och lagg till NEXT_STEPS
This commit is contained in:
@@ -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)
|
||||||
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user