chore(docs): update project documentation with deployment and maintenance changes
Test Suite / backend-pr-quick (push) Has been skipped
Test Suite / quick-import-pr-quick (push) Has been skipped
Test Suite / backend-full (push) Successful in 1m33s
Test Suite / flutter-quality (push) Failing after 1m24s

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
This commit is contained in:
Nils-Johan Gynther
2026-05-20 21:34:08 +02:00
parent e491a6c67f
commit 740e8e5897
3 changed files with 87 additions and 65 deletions
+28 -20
View File
@@ -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 # Nasta steg
Detta ar huvudroadmap for Recipe App. 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. - Deploy, healthcheck och testkorning ar reproducerbara i driftmiljo.
## Nyligen klart ## Nyligen klart
## Utförda steg (2026-05-19) ## Utförda steg (2026-05-19)
- [x] **Flyerimport-sessioner i backend:** Implementerat session-endpoints för senaste och specifik session. - [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] **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] **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] **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). - [x] **Regressionstester:** Backendtester för flyer-sessioner tillagda och gröna (3/3).
## Utförda steg (2026-05-18) ## 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] **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] **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] **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] **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`. - [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) ## 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] **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. - [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 - Deploy-script förbättrad med selektiv build och seed-kontroll
- Se `SESSION_2026-05-09_RECEIPT_IMPORT.md` för detaljer - 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 - **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. 5. Lokalisera kvarvarande stora Flutter-vyer i import/inventarie.
6. Förbereda avancerad AI-integration med tydlig loggning/audit. 6. Förbereda avancerad AI-integration med tydlig loggning/audit.
7. Påbörja EAN-stöd via Open Food Facts. 7. Påbörja EAN-stöd via Open Food Facts.
+22 -17
View File
@@ -1,21 +1,26 @@
# Nyheter och forbattringar (2026-05-20)
# Nyheter och förbättringar (2026-05-19) - **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.
- **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. - **Serververifiering och fix:** Rensningsskriptet uppdaterades efter verkligt driftfel (`ShoppingList` saknades) och pekar nu pa tabeller som faktiskt finns i schema/databas.
- **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. # Nyheter och förbättringar (2026-05-19)
- **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. - **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.
# Nyheter och förbättringar (2026-05-18) - **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`.
- **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`. - **Verifiering:** Backend typecheck och tjänstetester (`flyer-import.service.spec.ts`, 3/3) passerar.
- **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`. # Nyheter och förbättringar (2026-05-18)
- **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. - **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.
# Nyheter och förbättringar (2026-05-13) - **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. - **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. - **Prisma-migration:** `20260513150000_add_help_texts` — skapar `HelpText`-tabell och seedar initiala hjälptexter för kvittoimport (standard + admin-variant) på svenska.
+37 -28
View File
@@ -1,13 +1,22 @@
# Nyheter och förbättringar (2026-05-19) # Nyheter och forbattringar (2026-05-20)
- **Flyer-session API i recipe-api:** `flyer-import.controller.ts` exponerar `GET /api/flyer-import/sessions/latest` och `GET /api/flyer-import/sessions/:sessionId`. - **Deploy-flode utokat:** `deploy.sh` har nya flaggor `--migrate` och `--clean-database` for separat Prisma-migrering respektive datarensning.
- **Sessionmappning i service-lager:** `toFlyerImportResponseFromSession(...)` samlar mappning av session + items till standardiserat API-svar. - **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.
- **HTTP-semantik:** Saknad session returnerar `NotFoundException` (404), vilket förenklar klientlogik och observability. - **Databasrensning utan kategoriforlust:** `--clean-database` kor `backend/prisma/maintenance/clean-database.sql` mot `recipe-db` och bevarar `Category`/anvandare.
- **Query-optimering:** `getLatestSession(...)` använder en enda Prisma-fråga med `include: items` i stället för dubbelhämtning. - **Specialfil for underhall:** Ny fil `backend/prisma/maintenance/clean-database.sql` ar avsedd att vara permanent och uppdateras nar schema/tabeller forandras.
- **Flutter-cache-strategi:** Klienten persisterar endast metadata (`sessionId`, filnamn, valda rader) och hämtar full data från backend vid hydrering. - **Hotfix efter produktionstest:** SQL-filen korrigerad till faktiska Prisma-tabeller (`ShoppingListItem`, `InventoryConsumption`, `MealPlanEntry`, `RecipeShare`, `UserProduct`, m.fl.) och felaktiga tabeller (`ShoppingList`, `InventoryTransaction`, `MealPlanItem`) borttagna.
- **Teststatus:** `flyer-import.service.spec.ts` verifierar not-found, ägd session och tom latest-session (3/3 gröna). - **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.
# Migrering: Import-funktion → microservice-importer (GENOMFÖRD 2026-04-30) # 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: 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). - 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. Se även: README.md för användarflöde, och AI-FUNKTIONER.md för AI-detaljer.
# Prisma-migreringar: P3009 recovery och lessons learned # Prisma-migreringar: P3009 recovery och lessons learned
# Nyheter och förbättringar (2026-05-18) # 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`. - **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`. - **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. - **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. - **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`. - **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`. - **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`. - **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`. - **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. - **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`. - **Verifierad testjustering:** `receipt-import.security.spec.ts` validerar nu `UnauthorizedException` vid saknat användar-id i `upsertUnitMapping`.
# Drift och deploy (2026-05-11) # 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`. - **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. - **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:** > **Notera:**
> - Aktivera endast i test/staging, inte i produktion. > - Aktivera endast i test/staging, inte i produktion.
> - Loggarna kan vara omfattande och påverka prestanda. > - 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.