feat: enhance product model with subcategory, brand, tags, and nutrition; update related DTOs and services
This commit is contained in:
+49
-18
@@ -16,22 +16,22 @@
|
||||
| Matplanering (veckovy, inköpslista) | ✅ Klart |
|
||||
| Baslager (lista, lägg till, ta bort) | ✅ Klart |
|
||||
| Admin: Produkter (edit, merge, duplicate, restore) | ✅ Klart |
|
||||
| Receptredigering (frontend UX) | ⚠️ Delvis |
|
||||
| Receptbilder (upload UI) | ⚠️ Delvis |
|
||||
| Receptredigering (frontend UX) | ✅ Klart |
|
||||
| Receptbilder (upload URL) | ✅ Klart |
|
||||
| Portionsjustering | ❌ Saknas |
|
||||
| Produktkategorier — fast lista | ❌ Saknas |
|
||||
| Receptlista — filtrering & kortvy | ❌ Saknas |
|
||||
| Receptlista — filtrering & kortvy | ✅ Klart |
|
||||
| Matplan — inventariejämförelse | ❌ Saknas |
|
||||
| Taggning av produkter | ❌ Saknas |
|
||||
| Taggning av produkter | ⚠️ Delvis — kräver migration |
|
||||
| Näringsvärden på produkter | ⚠️ Delvis — kräver migration |
|
||||
| Autentisering (User-modell) | ❌ Saknas |
|
||||
| Användarspecifika produkter (UserProduct) | ❌ Saknas — kräver auth |
|
||||
|
||||
---
|
||||
|
||||
## Prioriterade förbättringar
|
||||
|
||||
### 1. Receptredigering — verifiera och slutför frontend-flödet
|
||||
Backend (`PATCH /api/recipes/:id`) är fullt implementerat och hanterar namn, beskrivning, instruktioner, `imageUrl` och ingredienser. Redigeringskoden i `app/recipes/[id]/RecipeDetailClient.tsx` finns men flödet för spara/avbryt behöver verifieras och eventuellt slutföras. `/recipes/[id]/edit/page.tsx` redirectar i dag tillbaka till detaljsidan — ta bort den omdirigering om redigering sker inline.
|
||||
|
||||
### 2. Portionsjustering av recept
|
||||
### 1. Portionsjustering av recept
|
||||
Recept lagras utan portionsangivelse. Lägg till ett `servings`-fält och låt användaren justera antal portioner i receptvyn — ingrediensmängderna räknas om proportionellt (t.ex. 4 → 6 pers: × 1,5).
|
||||
- **Databas:** `servings Int?` på `Recipe` i Prisma + migration
|
||||
- **Backend:** `servings` exponeras i `RecipeDto`, sätts vid create/update
|
||||
@@ -45,16 +45,7 @@ Veckovy och inköpslista fungerar. Nästa steg är att visa vilka ingredienser p
|
||||
### 4. Produktkategorier — definiera en fast lista
|
||||
Kategorier skrivs in som fritext i admin. Byt till en dropdown med fördefinierade kategorier (t.ex. "Mejeri, ost & ägg", "Kött, chark & fågel", "Frukt & Grönt") för konsistent data och bättre gruppering i baslagervyn.
|
||||
|
||||
### 5. Receptbilder — upload-UI i frontend
|
||||
Backend har `POST /api/recipes/:id/image` som tar emot en URL, laddar ner och optimerar bilden. `imageUrl` finns i databasen och formuläret i `write/WriteRecipePage.tsx` har redan ett `imageUrl`-fält. Saknas: ett upload-flöde eller URL-inmatning med förhandsgranskning i receptdetaljvyn (`app/recipes/[id]/RecipeDetailClient.tsx`).
|
||||
|
||||
### 6. Filtrering och kortvy för receptlistan
|
||||
Receptlistan (`app/recipes/RecipeGrid.tsx`) är en platt lista utan filter. Lägg till:
|
||||
- Söka på namn — klientside
|
||||
- Sortera på namn A–Ö eller senast tillagd — klientside
|
||||
- Kortrutnät med receptbild, namn och eventuellt portionsantal (efter att #2 är klar)
|
||||
|
||||
### 7. Utökad databas med taggning
|
||||
### 5. Utökad databas med taggning
|
||||
Lägg till stöd för taggar, underkategorier och varumärke direkt på produkter. Möjliggör filtrering, sökning och rekommendationer baserade på taggar.
|
||||
|
||||
**Schemaändringar (Prisma):**
|
||||
@@ -73,6 +64,46 @@ Lägg till stöd för taggar, underkategorier och varumärke direkt på produkte
|
||||
|
||||
**Rekommenderade taggar:** `ekologisk`, `svensk`, `laktosfri`, `glutenfri`, `vegan`, `nötfri`, `säsong`, `rökt`, `premium`, `lamm`, `korv`, `färs`, m.fl.
|
||||
|
||||
### 6. Näringsvärden på produkter
|
||||
Lägg till en `Nutrition`-modell kopplad till `Product` (one-to-one) med näringsvärden per 100g: kalorier, protein, fett, kolhydrater, salt, socker, fiber. Kan implementeras oberoende av autentisering.
|
||||
|
||||
**Schemaändring:**
|
||||
```prisma
|
||||
model Nutrition {
|
||||
id Int @id @default(autoincrement())
|
||||
calories Float?
|
||||
protein Float?
|
||||
fat Float?
|
||||
carbohydrates Float?
|
||||
salt Float?
|
||||
sugar Float?
|
||||
fiber Float?
|
||||
product Product @relation(fields: [productId], references: [id])
|
||||
productId Int @unique
|
||||
}
|
||||
```
|
||||
- **Backend:** CRUD via produktendpoints, exponeras i `ProductDto`
|
||||
- **Frontend:** Visa näringsvärden i produktdetalj och eventuellt i receptvyn (summerat per portion)
|
||||
|
||||
### 7. Autentisering — User-modell
|
||||
Förutsättning för användarspecifika produkter (punkt 10). Idag saknar hela appen autentisering — alla kan CRUD allt.
|
||||
|
||||
**Scope:** JWT-baserad auth med `User`-modell (id, name, email, passwordHash). Berör:
|
||||
- Backend: AuthModule med NestJS Guards, JWT-strategi, skyddade routes
|
||||
- Frontend: Inloggningsflöde, token-hantering i API-anrop
|
||||
- Databas: `User`-tabell + migration
|
||||
|
||||
> ⚠️ Detta är ett stort projekt i sig. Överväg om appen verkligen behöver fler användare eller om enkel HTTP Basic Auth räcker som skydd.
|
||||
|
||||
### 8. Användarspecifika produkter (UserProduct)
|
||||
Låter en användare spara egna produktvarianter med eget namn (t.ex. "Mormors Prästost") kopplade till en standardprodukt — eller fristående utan koppling. Kräver att punkt 9 (auth) är på plats.
|
||||
|
||||
> ⚠️ **Överlapp med InventoryItem:** `InventoryItem` lagrar redan productId, quantity, unit, brand, bestBeforeDate och är i princip en "användarens produkt i lager". Klargör skillnaden:
|
||||
> - `InventoryItem` = vad som finns hemma just nu (lager)
|
||||
> - `UserProduct` = ett eget produktkort/favorit som kan återanvändas utan att vara lager
|
||||
>
|
||||
> Om distinktionen inte är tydlig, riskerar `UserProduct` att duplicera `InventoryItem`-logiken.
|
||||
|
||||
---
|
||||
|
||||
## Teknisk skuld och städning
|
||||
|
||||
Reference in New Issue
Block a user