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:
Nils-Johan Gynther
2026-04-22 19:37:12 +02:00
parent ac3a8e96c0
commit b31af6181c
3 changed files with 760 additions and 616 deletions
+687 -580
View File
File diff suppressed because it is too large Load Diff
+33 -31
View File
@@ -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
+40 -5
View File
@@ -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.