Refactor next_steps_flutter and teknisk_beskrivning_flutter for user-scope implementation
- Updated next_steps_flutter.md to reflect completed tasks for user-scoped PantryItem and MealPlanEntry, including API contract publication and migration application. - Enhanced the prioritization plan with clear completion dates and added localization tasks. - Expanded teknisk_beskrivning_flutter.md with details on inventory filtering, sorting, and user-scoped backend changes, including migration notes and localization setup. - Improved error handling documentation and localization usage guidelines.
This commit is contained in:
+687
-580
File diff suppressed because it is too large
Load Diff
+33
-31
@@ -32,39 +32,40 @@ Adminfloden migreras efter att ovanstaende ar verifierat.
|
|||||||
|
|
||||||
## Prioriterad plan (ordning)
|
## Prioriterad plan (ordning)
|
||||||
|
|
||||||
## Fas 0 - Backend-forarbete for user-scope (ny)
|
## Fas 0 - Backend-forarbete for user-scope (KLAR 2026-04-22)
|
||||||
- Gor `PantryItem` user-scopad (userId + productId unik per anvandare).
|
- [x] Gor `PantryItem` user-scopad (userId + productId unik per anvandare).
|
||||||
- Gor matplan user-scopad och filtrera list/upsert/delete per inloggad anvandare.
|
- [x] Gor matplan user-scopad och filtrera list/upsert/delete per inloggad anvandare.
|
||||||
- Uppdatera matplanens inventory-jamforelse till anvandarspecifikt pantry.
|
- [x] Uppdatera matplanens inventory-jamforelse till anvandarspecifikt pantry.
|
||||||
- Publicera uppdaterade API-kontrakt innan vidare Flutter-parity for matplan/baslager.
|
- [x] Publicera uppdaterade API-kontrakt innan vidare Flutter-parity for matplan/baslager.
|
||||||
|
- [x] Migration 20260422130000_user_scope_pantry_meal_plan applicerad.
|
||||||
|
|
||||||
## Fas 1 - Stabil app-shell (forst)
|
## Fas 1 - Stabil app-shell (KLAR 2026-04-22)
|
||||||
- Bygg tydlig auth-gate i router.
|
- [x] Bygg tydlig auth-gate i router.
|
||||||
- Centralisera API-fel (401/403/500) i ett gemensamt lager.
|
- [x] Centralisera API-fel (401/403/500) i ett gemensamt lager (`mapErrorToUserMessage`).
|
||||||
- Skapa gemensamma UI-komponenter for loading, empty, error.
|
- [x] Skapa gemensamma UI-komponenter for loading, empty, error.
|
||||||
- Satt en enhetlig navigationsstruktur (web forst, mobil-redo).
|
- [x] Satt en enhetlig navigationsstruktur (web forst, mobil-redo).
|
||||||
|
- [x] Lokalisering: ARB-infrastruktur pa plats (`flutter_localizations`, `l10n.yaml`, `app_sv.arb`, `synthetic-package: false`, `flutter gen-l10n` i Dockerfile).
|
||||||
|
- [x] Regressionstest for svenska strangkvalitet tillagd.
|
||||||
|
|
||||||
Motivering: minskar regressionsrisk och gor resten av migreringen snabbare.
|
## Fas 2 - Auth parity (KLAR 2026-04-22)
|
||||||
|
- [x] Hardna loginflodet (tydliga felmeddelanden, retries dar relevant).
|
||||||
|
- [x] Verifiera token-livscykel (reload/hard refresh/logout).
|
||||||
|
- [x] Implementera automatisk hantering av utgangen token (401 -> logout -> login).
|
||||||
|
|
||||||
## Fas 2 - Auth parity
|
## Fas 3 - Recept parity (KLAR 2026-04-22)
|
||||||
- Hardna loginflodet (tydliga felmeddelanden, retries dar relevant).
|
- [x] Lista -> detalj -> skapa -> redigera -> ta bort.
|
||||||
- Verifiera token-livscykel (reload/hard refresh/logout).
|
- [x] Knyt ihop med parse-markdown-proxy.
|
||||||
- Implementera automatisk hantering av utgangen token (401 -> logout -> login).
|
- [x] Behall backend som enda plats for matchning, validering och affarslogik.
|
||||||
|
|
||||||
## Fas 3 - Recept parity
|
## Fas 4 - Inventarie parity (KLAR 2026-04-22)
|
||||||
- Lista -> detalj -> skapa -> redigera -> ta bort.
|
- [x] Lista med filter/sortering (plats + sort via Riverpod-querystate).
|
||||||
- Knyt ihop med parse-markdown-proxy.
|
- [x] Skapa och uppdatera inventariepost.
|
||||||
- Behall backend som enda plats for matchning, validering och affarslogik.
|
- [x] Konsumtion och konsumtionshistorik.
|
||||||
|
|
||||||
## Fas 4 - Inventarie parity
|
## Fas 5 - Matplan parity (NASTA)
|
||||||
- Lista med filter/sortering.
|
- Veckovy med receptval per dag mot nu user-scopat `GET /api/meal-plan?from=&to=`.
|
||||||
- Skapa och uppdatera inventariepost.
|
|
||||||
- Konsumtion och konsumtionshistorik.
|
|
||||||
|
|
||||||
## Fas 5 - Matplan parity
|
|
||||||
- Veckovy med receptval per dag.
|
|
||||||
- Portionsjustering per dag.
|
- Portionsjustering per dag.
|
||||||
- Inkoplista och inventariejamforelse.
|
- Inkoplista och inventariejamforelse mot anvandarens pantry.
|
||||||
|
|
||||||
## Fas 6 - Import parity
|
## Fas 6 - Import parity
|
||||||
- URL/PDF/bild via befintliga endpoints.
|
- URL/PDF/bild via befintliga endpoints.
|
||||||
@@ -103,10 +104,11 @@ En feature ar klar nar allt nedan ar uppfyllt:
|
|||||||
|
|
||||||
## Nasta konkreta sprint (rekommenderad)
|
## Nasta konkreta sprint (rekommenderad)
|
||||||
|
|
||||||
1. Fas 0: backend-andringar for user-scope i pantry/matplan.
|
1. Fas 5: Matplan parity mot user-scopat API (veckovy, inkoplista, inventariejamforelse).
|
||||||
2. Fas 1: app-shell hardening.
|
2. Fa 6: Import parity.
|
||||||
3. Fas 2: auth parity helt klar.
|
3. Fas 7: Profil/admin parity.
|
||||||
4. Smoke-test pa testdomanen och avstamning.
|
4. Fortatt flytt av UI-strangar till ARB (inventarie, pantry, recept).
|
||||||
|
5. Smoke-test pa testdomanen och avstamning.
|
||||||
|
|
||||||
## Tumregel
|
## Tumregel
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,23 @@ Relaterade dokument:
|
|||||||
- Exponering via extern Caddy med site `test.gynther.se` -> `recipe-flutter:5000`.
|
- Exponering via extern Caddy med site `test.gynther.se` -> `recipe-flutter:5000`.
|
||||||
- API anrop gar same-origin via `/api` och proxas internt till `recipe-api:8080`.
|
- API anrop gar same-origin via `/api` och proxas internt till `recipe-api:8080`.
|
||||||
|
|
||||||
|
### Inventarie (2026-04-22)
|
||||||
|
- Filtrering per plats (alla/kyl/frys/skafferi) via `inventoryLocationFilterProvider`.
|
||||||
|
- Sortering (namn A-O, bast fore stigande/fallande) via `inventorySortFilterProvider`.
|
||||||
|
- Riverpod-query (`InventoryQuery`) skickar `location` och `sort` som queryparametrar till backenden.
|
||||||
|
- Alla felmeddelanden gar via `mapErrorToUserMessage(error, context)`.
|
||||||
|
|
||||||
|
### Baslager/Pantry (2026-04-22)
|
||||||
|
- Pantry-produkter grupperas nu pa kategori utifrån backend-relationen `categoryRef` (rekursiv `parent`-kedja -> `categoryPath`), med fallback till legacy `product.category` och sist `Ovrigt`.
|
||||||
|
- `PantryProduct` har `categoryId` och `categoryPath` som parsas fran API-svaret.
|
||||||
|
|
||||||
|
### Backend: user-scope for pantry och matplan (2026-04-22)
|
||||||
|
- `PantryItem` och `MealPlanEntry` ar nu user-scopade i Prisma-schemat.
|
||||||
|
- `pantry`-controller/service filtrerar alltid per `userId` fran JWT.
|
||||||
|
- `meal-plan`-controller/service filtrerar alltid per `userId`; `inventoryCompare` anvander inloggad anvandares pantry.
|
||||||
|
- Migration: `20260422130000_user_scope_pantry_meal_plan` applicerad pa server.
|
||||||
|
- Next.js-frontenden kravde inga funktionella andringar (forfrågningar gar redan via auth-proxy).
|
||||||
|
|
||||||
## Arkitektur
|
## Arkitektur
|
||||||
### Lager
|
### Lager
|
||||||
- Presentation: skarmar och widgets i `flutter/lib/features/*/presentation`.
|
- Presentation: skarmar och widgets i `flutter/lib/features/*/presentation`.
|
||||||
@@ -55,7 +72,25 @@ Relaterade dokument:
|
|||||||
- `ApiClient` i `flutter/lib/core/api/api_client.dart` exponerar: `getJson`, `postJson`, `patchJson`, `putJson`, `deleteJson`.
|
- `ApiClient` i `flutter/lib/core/api/api_client.dart` exponerar: `getJson`, `postJson`, `patchJson`, `putJson`, `deleteJson`.
|
||||||
- Centralicerad HTTP-felklassning: 401 -> `ApiErrorType.unauthorized`, 403 -> `forbidden`, 5xx -> `server`, natverksfel -> `network`.
|
- Centralicerad HTTP-felklassning: 401 -> `ApiErrorType.unauthorized`, 403 -> `forbidden`, 5xx -> `server`, natverksfel -> `network`.
|
||||||
- `ApiException` i `flutter/lib/core/api/api_exception.dart` ar den enda feltypen som propageras fran repositories.
|
- `ApiException` i `flutter/lib/core/api/api_exception.dart` ar den enda feltypen som propageras fran repositories.
|
||||||
- `mapErrorToUserMessage()` i `flutter/lib/core/api/api_error_mapper.dart` oversatter fel till svenska anvandarmedddelanden.
|
- `mapErrorToUserMessage(error, context)` i `flutter/lib/core/api/api_error_mapper.dart` oversatter fel till lokaliserade anvandarmedddelanden. Tar numera `BuildContext` som andra argument for att hämta korrekt sprak fran `AppLocalizations`.
|
||||||
|
|
||||||
|
### Lokalisering (2026-04-22)
|
||||||
|
- Flutter `flutter_localizations` + `intl` tillagda i `pubspec.yaml` med `generate: true`.
|
||||||
|
- Konfigurationsfil: [flutter/l10n.yaml](flutter/l10n.yaml) med `synthetic-package: false`.
|
||||||
|
- Kallstrangar i [flutter/lib/l10n/app_sv.arb](flutter/lib/l10n/app_sv.arb) och [flutter/lib/l10n/app_en.arb](flutter/lib/l10n/app_en.arb).
|
||||||
|
- Generade filer hamnar i `flutter/lib/l10n/generated/` och checkas inte in.
|
||||||
|
- Hjalpare `context.l10n` i [flutter/lib/core/l10n/l10n.dart](flutter/lib/core/l10n/l10n.dart).
|
||||||
|
- `MaterialApp.router` konfigurerad med `localizationsDelegates`, `supportedLocales` och `locale: const Locale('sv')`.
|
||||||
|
- Dockerfilen kor `flutter gen-l10n` innan `flutter build web` for att generera Dart-koden i containerbygget.
|
||||||
|
- Regressionstest i [flutter/test/core/swedish_strings_regression_test.dart](flutter/test/core/swedish_strings_regression_test.dart) failar om vanliga ASCII-varianter (Valj, Lagg, Forsok, etc.) dyker upp igen i `lib/`.
|
||||||
|
|
||||||
|
#### Anvandning av lokalisering
|
||||||
|
For att lagga till en ny lokaliserad strang:
|
||||||
|
1. Lagg till nyckeln i `app_sv.arb` (och `app_en.arb`).
|
||||||
|
2. Kör `flutter gen-l10n` lokalt (eller lat Docker-bygget gora det).
|
||||||
|
3. Anvand `context.l10n.dinNyckel` i widgetkoden.
|
||||||
|
|
||||||
|
For felstrangar fran API: anvand alltid `mapErrorToUserMessage(error, context)` — lagg inte in hardkodade strängar.
|
||||||
|
|
||||||
### Recipes
|
### Recipes
|
||||||
- `GET /api/recipes` — receptlista.
|
- `GET /api/recipes` — receptlista.
|
||||||
@@ -145,7 +180,7 @@ Om `test.gynther.se` slutar svara efter städning med `--remove-orphans`, starta
|
|||||||
|
|
||||||
## Nasta tekniska steg
|
## Nasta tekniska steg
|
||||||
Fortsatt migrering enligt prioritering i [next_steps_flutter.md](next_steps_flutter.md):
|
Fortsatt migrering enligt prioritering i [next_steps_flutter.md](next_steps_flutter.md):
|
||||||
1. Auth parity (session behavior refinements).
|
1. Fortatt lokalisering av inventarie/pantry/recept-strangar till ARB.
|
||||||
2. Recipes parity (list -> detail -> create/edit).
|
2. Matplan parity mot nu user-scopat API.
|
||||||
3. Inventory and meal plan pages.
|
3. Import parity.
|
||||||
4. Profile/admin parity.
|
4. Profil/admin parity.
|
||||||
|
|||||||
Reference in New Issue
Block a user