diff --git a/NEXT_STEPS.md b/NEXT_STEPS.md new file mode 100644 index 00000000..aa79c9fb --- /dev/null +++ b/NEXT_STEPS.md @@ -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) diff --git a/README.md b/README.md index 0c4c2d7e..b7dc0bee 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@ 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 - **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 -- **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 - **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 diff --git a/TEKNISK_BESKRIVNING.md b/TEKNISK_BESKRIVNING.md index a7928e11..e0f20e50 100644 --- a/TEKNISK_BESKRIVNING.md +++ b/TEKNISK_BESKRIVNING.md @@ -1,6 +1,7 @@ # 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 @@ -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) | | **Admin: Produkter** | `app/admin/products/page.tsx` | Produktadmin-panel | | | `AdminProductList.tsx` | Lista produkter, sök, sortera | -| | `NameForm.tsx` | Redigera produktnamn | -| | `CanonicalNameForm.tsx` | Redigera canonical name | +| | `EditProductForm.tsx` | Inline redigering av name, canonicalName, category + soft-delete | | | `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) @@ -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/admin/merge-preview-proxy` | GET | Proxies produktmerge-preview | | `/api/products` | GET | Lista/proxies produkter | +| `/api/recipes` | GET, POST | Lista recept + spara nytt recept (proxy till backend) | ### Frontend utbyggbarhet @@ -150,8 +156,12 @@ backend/src/ └── dto/ ├── create-recipe.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 @@ -258,7 +268,7 @@ GET /api/recipes/:id/inventory-preview Jämför recept mot inventarie GET /api/products Lista alla aktiva produkter POST /api/products Skapa ny 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 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) ``` +### 🛀 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) @@ -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