From 740e8e5897524b4a0b7d6b7a6c60d39344bed87a Mon Sep 17 00:00:00 2001 From: Nils-Johan Gynther Date: Wed, 20 May 2026 21:34:08 +0200 Subject: [PATCH] chore(docs): update project documentation with deployment and maintenance changes Updated three documentation files to reflect recent deployment and maintenance improvements: - NEXT_STEPS.md: Added completed steps for 2026-05-20 including deploy script updates, Prisma integration, standardized database cleaning, and production fixes - README.md: Added new deployment flags and maintenance file information for 2026-05-20 release - TEKNISK_BESKRIVNING.md: Added technical details about new deploy flow, database cleaning process, and production hotfix resolution --- NEXT_STEPS.md | 48 ++++++++++++++++++------------- README.md | 39 ++++++++++++++----------- TEKNISK_BESKRIVNING.md | 65 ++++++++++++++++++++++++------------------ 3 files changed, 87 insertions(+), 65 deletions(-) diff --git a/NEXT_STEPS.md b/NEXT_STEPS.md index 1c89d2d2..10bafeb3 100644 --- a/NEXT_STEPS.md +++ b/NEXT_STEPS.md @@ -1,3 +1,11 @@ +## Utforda steg (2026-05-20) + +- [x] **Deploy-script uppdaterat:** `deploy.sh` utokat med `--migrate` och `--clean-database`. +- [x] **Prisma-integrering i deploy:** `--migrate` kor `prisma migrate deploy` i `recipe-api` med explicit schema-parameter. +- [x] **Databasrensning standardiserad:** Ny underhallsfil `backend/prisma/maintenance/clean-database.sql` skapad for reset som bevarar kategorier. +- [x] **Produktionsnara fel rattat:** `clean-database.sql` korrigerad efter serverfel (`Table 'ShoppingList' doesn't exist`). +- [x] **Tabellista hardad:** SQL-filen anvander nu existerande tabeller i nuvarande Prisma-schema och tar bort beroenden i saker ordning med `FOREIGN_KEY_CHECKS`. + # Nasta steg Detta ar huvudroadmap for Recipe App. @@ -41,25 +49,25 @@ MVP ar uppnadd nar en vanlig anvandare kan importera, granska och spara kvitto/r - Deploy, healthcheck och testkorning ar reproducerbara i driftmiljo. -## Nyligen klart - -## Utförda steg (2026-05-19) - -- [x] **Flyerimport-sessioner i backend:** Implementerat session-endpoints för senaste och specifik session. -- [x] **Flyerimport-persistens i Flutter:** Lättviktig lagring i `SharedPreferences` med `sessionId` + vald state. -- [x] **Hydreringsflöde i klient:** Restore lokalt -> hämta via sessionId -> fallback till latest-session. -- [x] **HTTP-semantik + optimering:** 404 för saknad session och single-query för latest-session. -- [x] **Regressionstester:** Backendtester för flyer-sessioner tillagda och gröna (3/3). - -## Utförda steg (2026-05-18) - -- [x] **ESLint i backend + CI:** ESLint-konfiguration tillagd i backend och CI-workflow uppdaterad med lint-step för PR/push. -- [x] **Dart lint-konfig aktiverad:** `flutter/analysis_options.yaml` tillagd för att säkerställa `flutter_lints` i analyskörningar. -- [x] **Prisma query logging styrbar per miljö:** `PRISMA_LOG_QUERIES` implementerad i backend samt kopplad i `compose.yml`. -- [x] **Dokumenterat aktivering av query-loggar:** Instruktion att sätta `PRISMA_LOG_QUERIES=1` och starta om `recipe-api` i test/staging. -- [x] **Korrigerat testförväntan i receipt-import:** Security-test för saknat användar-id uppdaterat till `UnauthorizedException`. - -## Utförda steg (2026-05-13) +## Nyligen klart + +## Utförda steg (2026-05-19) + +- [x] **Flyerimport-sessioner i backend:** Implementerat session-endpoints för senaste och specifik session. +- [x] **Flyerimport-persistens i Flutter:** Lättviktig lagring i `SharedPreferences` med `sessionId` + vald state. +- [x] **Hydreringsflöde i klient:** Restore lokalt -> hämta via sessionId -> fallback till latest-session. +- [x] **HTTP-semantik + optimering:** 404 för saknad session och single-query för latest-session. +- [x] **Regressionstester:** Backendtester för flyer-sessioner tillagda och gröna (3/3). + +## Utförda steg (2026-05-18) + +- [x] **ESLint i backend + CI:** ESLint-konfiguration tillagd i backend och CI-workflow uppdaterad med lint-step för PR/push. +- [x] **Dart lint-konfig aktiverad:** `flutter/analysis_options.yaml` tillagd för att säkerställa `flutter_lints` i analyskörningar. +- [x] **Prisma query logging styrbar per miljö:** `PRISMA_LOG_QUERIES` implementerad i backend samt kopplad i `compose.yml`. +- [x] **Dokumenterat aktivering av query-loggar:** Instruktion att sätta `PRISMA_LOG_QUERIES=1` och starta om `recipe-api` i test/staging. +- [x] **Korrigerat testförväntan i receipt-import:** Security-test för saknat användar-id uppdaterat till `UnauthorizedException`. + +## Utförda steg (2026-05-13) - [x] **Centralt hjälptextsystem (backend):** Nytt `HelpTextsModule` med service, controller och DTO. `GET /api/help-texts/:key` returnerar rätt hjälptext baserat på användarroll (prioritetsordning: admin → user → default). `PUT /api/help-texts/:key/:scope` kräver admin-roll. - [x] **Prisma-migration:** `20260513150000_add_help_texts` — `HelpText`-tabell med `@@unique([key, scope])`-constraint och index. Seed-data för `receipt_import` (default + admin-scope) på svenska. @@ -149,7 +157,7 @@ MVP ar uppnadd nar en vanlig anvandare kan importera, granska och spara kvitto/r - Deploy-script förbättrad med selektiv build och seed-kontroll - Se `SESSION_2026-05-09_RECEIPT_IMPORT.md` för detaljer - **Todo:** Deploy till prod, testa i live miljö, ev. add UI för user private rename/merge -4. Verifiera flyerimportens sessionhydrering end-to-end i test/staging (tab-byte + app-omstart). +4. Verifiera flyerimportens sessionhydrering end-to-end i test/staging (tab-byte + app-omstart). 5. Lokalisera kvarvarande stora Flutter-vyer i import/inventarie. 6. Förbereda avancerad AI-integration med tydlig loggning/audit. 7. Påbörja EAN-stöd via Open Food Facts. diff --git a/README.md b/README.md index a7efc3a3..581d96f2 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,26 @@ +# Nyheter och forbattringar (2026-05-20) -# Nyheter och förbättringar (2026-05-19) - -- **Flyerimport-sessioner i backend:** Nya endpoints `GET /api/flyer-import/sessions/latest` och `GET /api/flyer-import/sessions/:sessionId` för att återhämta senaste eller specifik importsession per användare. -- **Persistens i Flutter för flyerimport:** `flyer_import_session.dart` sparar nu endast `sessionId`, `fileName` och valda rader i `SharedPreferences` för lättviktig cache. -- **Hydrering vid återöppning:** Flutter-tabben återläser lokalt tillstånd och hämtar därefter full session från backend, med fallback till senaste session. -- **Robustare felsemantik:** Backend returnerar `NotFoundException` (404) för saknade sessioner i stället för `BadRequestException`. -- **Verifiering:** Backend typecheck och tjänstetester (`flyer-import.service.spec.ts`, 3/3) passerar. - -# Nyheter och förbättringar (2026-05-18) - -- **CI: ESLint för backend:** ESLint är infört i backend (`backend/eslint.config.mjs`) och körs i GitHub Actions (`.github/workflows/test.yml`) via steget `Lint backend`. -- **CI: Dart lints aktiverade:** `flutter/analysis_options.yaml` är tillagd med `include: package:flutter_lints/flutter.yaml`, så `flutter analyze` använder explicita lint-regler. -- **Prisma query logging i test/staging:** Backend stödjer nu env-styrd query-loggning via `PRISMA_LOG_QUERIES` i `backend/src/prisma/prisma.service.ts`. -- **Compose-stöd för loggning:** `compose.yml` har `PRISMA_LOG_QUERIES: "${PRISMA_LOG_QUERIES:-0}"` för säker default av. -- **Testfix receipt-import:** Säkerhetstestet för saknat användar-id i `upsertUnitMapping` är uppdaterat till `UnauthorizedException`, i linje med controllerns beteende. - -# Nyheter och förbättringar (2026-05-13) +- **Nya deploy-flaggor:** `deploy.sh` stodjer nu `--migrate` (Prisma deploy-migrationer) och `--clean-database` (rensar applikationsdata men behaller kategorier). +- **Ny underhallsfil:** `backend/prisma/maintenance/clean-database.sql` infordes for kontrollerad reset av data i test/staging. +- **Serververifiering och fix:** Rensningsskriptet uppdaterades efter verkligt driftfel (`ShoppingList` saknades) och pekar nu pa tabeller som faktiskt finns i schema/databas. + +# Nyheter och förbättringar (2026-05-19) + +- **Flyerimport-sessioner i backend:** Nya endpoints `GET /api/flyer-import/sessions/latest` och `GET /api/flyer-import/sessions/:sessionId` för att återhämta senaste eller specifik importsession per användare. +- **Persistens i Flutter för flyerimport:** `flyer_import_session.dart` sparar nu endast `sessionId`, `fileName` och valda rader i `SharedPreferences` för lättviktig cache. +- **Hydrering vid återöppning:** Flutter-tabben återläser lokalt tillstånd och hämtar därefter full session från backend, med fallback till senaste session. +- **Robustare felsemantik:** Backend returnerar `NotFoundException` (404) för saknade sessioner i stället för `BadRequestException`. +- **Verifiering:** Backend typecheck och tjänstetester (`flyer-import.service.spec.ts`, 3/3) passerar. + +# Nyheter och förbättringar (2026-05-18) + +- **CI: ESLint för backend:** ESLint är infört i backend (`backend/eslint.config.mjs`) och körs i GitHub Actions (`.github/workflows/test.yml`) via steget `Lint backend`. +- **CI: Dart lints aktiverade:** `flutter/analysis_options.yaml` är tillagd med `include: package:flutter_lints/flutter.yaml`, så `flutter analyze` använder explicita lint-regler. +- **Prisma query logging i test/staging:** Backend stödjer nu env-styrd query-loggning via `PRISMA_LOG_QUERIES` i `backend/src/prisma/prisma.service.ts`. +- **Compose-stöd för loggning:** `compose.yml` har `PRISMA_LOG_QUERIES: "${PRISMA_LOG_QUERIES:-0}"` för säker default av. +- **Testfix receipt-import:** Säkerhetstestet för saknat användar-id i `upsertUnitMapping` är uppdaterat till `UnauthorizedException`, i linje med controllerns beteende. + +# Nyheter och förbättringar (2026-05-13) - **Centralt hjälptextsystem:** Nytt backend-modul (`HelpTextsModule`) med `GET /api/help-texts/:key` (rollmedveten) och `PUT /api/help-texts/:key/:scope` (admin). Stöd för scopade hjälptexter: `admin`, `user`, `default` med prioritetsordning beroende på användarroll. - **Prisma-migration:** `20260513150000_add_help_texts` — skapar `HelpText`-tabell och seedar initiala hjälptexter för kvittoimport (standard + admin-variant) på svenska. diff --git a/TEKNISK_BESKRIVNING.md b/TEKNISK_BESKRIVNING.md index 8db090c7..03a67101 100644 --- a/TEKNISK_BESKRIVNING.md +++ b/TEKNISK_BESKRIVNING.md @@ -1,13 +1,22 @@ -# Nyheter och förbättringar (2026-05-19) - -- **Flyer-session API i recipe-api:** `flyer-import.controller.ts` exponerar `GET /api/flyer-import/sessions/latest` och `GET /api/flyer-import/sessions/:sessionId`. -- **Sessionmappning i service-lager:** `toFlyerImportResponseFromSession(...)` samlar mappning av session + items till standardiserat API-svar. -- **HTTP-semantik:** Saknad session returnerar `NotFoundException` (404), vilket förenklar klientlogik och observability. -- **Query-optimering:** `getLatestSession(...)` använder en enda Prisma-fråga med `include: items` i stället för dubbelhämtning. -- **Flutter-cache-strategi:** Klienten persisterar endast metadata (`sessionId`, filnamn, valda rader) och hämtar full data från backend vid hydrering. -- **Teststatus:** `flyer-import.service.spec.ts` verifierar not-found, ägd session och tom latest-session (3/3 gröna). - -# Migrering: Import-funktion → microservice-importer (GENOMFÖRD 2026-04-30) +# Nyheter och forbattringar (2026-05-20) + +- **Deploy-flode utokat:** `deploy.sh` har nya flaggor `--migrate` och `--clean-database` for separat Prisma-migrering respektive datarensning. +- **Migrate i runtime-miljo:** `--migrate` kor `npx prisma migrate deploy --schema prisma/schema.prisma` i `recipe-api` efter att containrarna startat och backend ar redo. +- **Databasrensning utan kategoriforlust:** `--clean-database` kor `backend/prisma/maintenance/clean-database.sql` mot `recipe-db` och bevarar `Category`/anvandare. +- **Specialfil for underhall:** Ny fil `backend/prisma/maintenance/clean-database.sql` ar avsedd att vara permanent och uppdateras nar schema/tabeller forandras. +- **Hotfix efter produktionstest:** SQL-filen korrigerad till faktiska Prisma-tabeller (`ShoppingListItem`, `InventoryConsumption`, `MealPlanEntry`, `RecipeShare`, `UserProduct`, m.fl.) och felaktiga tabeller (`ShoppingList`, `InventoryTransaction`, `MealPlanItem`) borttagna. +- **Operativ erfarenhet:** Forsta korningen misslyckade pa server med `ERROR 1146 ... ShoppingList doesn't exist`; fixen ar incheckad och pushad for robust korning i varierande databaslagen. + +# Nyheter och förbättringar (2026-05-19) + +- **Flyer-session API i recipe-api:** `flyer-import.controller.ts` exponerar `GET /api/flyer-import/sessions/latest` och `GET /api/flyer-import/sessions/:sessionId`. +- **Sessionmappning i service-lager:** `toFlyerImportResponseFromSession(...)` samlar mappning av session + items till standardiserat API-svar. +- **HTTP-semantik:** Saknad session returnerar `NotFoundException` (404), vilket förenklar klientlogik och observability. +- **Query-optimering:** `getLatestSession(...)` använder en enda Prisma-fråga med `include: items` i stället för dubbelhämtning. +- **Flutter-cache-strategi:** Klienten persisterar endast metadata (`sessionId`, filnamn, valda rader) och hämtar full data från backend vid hydrering. +- **Teststatus:** `flyer-import.service.spec.ts` verifierar not-found, ägd session och tom latest-session (3/3 gröna). + +# Migrering: Import-funktion → microservice-importer (GENOMFÖRD 2026-04-30) Recipe-apps importflöde (quick-import, parse-markdown, receipt-import) är nu migrerat till en separat microservice-importer: - All URL-skrapning, OCR, PDF-parsning och AI-kvittoparsning sker i microservice-importer (NestJS, Docker, port 3001 internt). @@ -23,23 +32,23 @@ Verifiering: Se även: README.md för användarflöde, och AI-FUNKTIONER.md för AI-detaljer. -# Prisma-migreringar: P3009 recovery och lessons learned - -# Nyheter och förbättringar (2026-05-18) - -- **Flyerimport intern i recipe-api:** `/api/flyer-import/parse` använder nu en intern pipeline i backend (`TextExtractorService` + `AiFlyerParserService` + `FlyerNormalizerService`) och är inte längre beroende av `importer-api`. -- **Textutvinning för flyer:** PDF tolkas primärt med `pdf-parse`; vid bildfiler eller skannad PDF-fallback används OCR via `tesseract.js`. -- **AI-parse för flyer:** Mistral Tiny används för strukturerad extraktion av flyer-rader till JSON, följt av normalisering av pris/enhet/kategori. -- **Timeout/retry-härdning för flyer-AI:** `AiFlyerParserService` har konfigurerbar timeout (`FLYER_AI_TIMEOUT_MS`, default 30000 ms) och retry med successivt kortare textfönster (`FLYER_AI_RETRIES`, default 2) för att minska 503 vid långsamma modellanrop. - -- **Backend linting i CI:** ESLint är infört för backend (`backend/eslint.config.mjs`, `npm run lint`) och körs i `.github/workflows/test.yml`. -- **Flutter lint-konfiguration:** `flutter/analysis_options.yaml` är tillagd och inkluderar `package:flutter_lints/flutter.yaml`. -- **Prisma query logging (miljöstyrd):** `PrismaService` konfigurerar loggnivåer via env-variabeln `PRISMA_LOG_QUERIES`. -- **Runtime-konfiguration:** `compose.yml` exponerar `PRISMA_LOG_QUERIES` till `recipe-api` med default `0`. -- **Aktivering i testmiljö:** Sätt `PRISMA_LOG_QUERIES=1` och starta om `recipe-api` för att få SQL query-loggar. -- **Verifierad testjustering:** `receipt-import.security.spec.ts` validerar nu `UnauthorizedException` vid saknat användar-id i `upsertUnitMapping`. - -# Drift och deploy (2026-05-11) +# Prisma-migreringar: P3009 recovery och lessons learned + +# Nyheter och förbättringar (2026-05-18) + +- **Flyerimport intern i recipe-api:** `/api/flyer-import/parse` använder nu en intern pipeline i backend (`TextExtractorService` + `AiFlyerParserService` + `FlyerNormalizerService`) och är inte längre beroende av `importer-api`. +- **Textutvinning för flyer:** PDF tolkas primärt med `pdf-parse`; vid bildfiler eller skannad PDF-fallback används OCR via `tesseract.js`. +- **AI-parse för flyer:** Mistral Tiny används för strukturerad extraktion av flyer-rader till JSON, följt av normalisering av pris/enhet/kategori. +- **Timeout/retry-härdning för flyer-AI:** `AiFlyerParserService` har konfigurerbar timeout (`FLYER_AI_TIMEOUT_MS`, default 30000 ms) och retry med successivt kortare textfönster (`FLYER_AI_RETRIES`, default 2) för att minska 503 vid långsamma modellanrop. + +- **Backend linting i CI:** ESLint är infört för backend (`backend/eslint.config.mjs`, `npm run lint`) och körs i `.github/workflows/test.yml`. +- **Flutter lint-konfiguration:** `flutter/analysis_options.yaml` är tillagd och inkluderar `package:flutter_lints/flutter.yaml`. +- **Prisma query logging (miljöstyrd):** `PrismaService` konfigurerar loggnivåer via env-variabeln `PRISMA_LOG_QUERIES`. +- **Runtime-konfiguration:** `compose.yml` exponerar `PRISMA_LOG_QUERIES` till `recipe-api` med default `0`. +- **Aktivering i testmiljö:** Sätt `PRISMA_LOG_QUERIES=1` och starta om `recipe-api` för att få SQL query-loggar. +- **Verifierad testjustering:** `receipt-import.security.spec.ts` validerar nu `UnauthorizedException` vid saknat användar-id i `upsertUnitMapping`. + +# Drift och deploy (2026-05-11) - **Flutter build-artifacts:** Byggda filer i `flutter/build/` och `.flutter-plugins-dependencies` ska inte versionshanteras. Vid deploy på server: kör `git restore flutter/build flutter/.flutter-plugins-dependencies` och `git clean -fd flutter/build` innan `git pull`. - **Vanliga fel:** Om du får felmeddelandet "Your local changes to the following files would be overwritten by merge", beror det på att genererade filer är modifierade lokalt. Se till att alltid rensa dessa innan uppdatering. @@ -2114,4 +2123,4 @@ För att aktivera Prisma query logging i testmiljön: > **Notera:** > - Aktivera endast i test/staging, inte i produktion. > - Loggarna kan vara omfattande och påverka prestanda. -> - Variabeln är avsiktligt inte dokumenterad i huvudkonfigurationen för att undvika oavsiktlig aktivering. +> - Variabeln är avsiktligt inte dokumenterad i huvudkonfigurationen för att undvika oavsiktlig aktivering.