From 9417d305748f47164e763fd9dc3c929e60803d92 Mon Sep 17 00:00:00 2001 From: Nils-Johan Gynther Date: Fri, 1 May 2026 00:28:09 +0200 Subject: [PATCH] Update to .md-files --- NEXT_STEPS.md | 5 +- TEKNISK_BESKRIVNING.md | 5 ++ migrering-MSI.md | 102 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 107 insertions(+), 5 deletions(-) diff --git a/NEXT_STEPS.md b/NEXT_STEPS.md index 042ffc78..740adfae 100644 --- a/NEXT_STEPS.md +++ b/NEXT_STEPS.md @@ -12,6 +12,7 @@ | Receptredigering och borttagning (JWT-autentisering) | ✅ Klart | | Snabbimport (URL/PDF/bild/ICA) | ✅ Klart | | Kvittoimport (Mistral AI, OCR, alias) | ✅ Klart | +| Import-microservice (importer-api, backend-till-backend) | ✅ Klart (2026-04-30) | | Matplanering (veckovy, inköpslista) | ✅ Klart | | Matplan — portionsjustering per dag | ✅ Klart | | Matplan — inventariejämförelse (backend) | ✅ Klart | @@ -52,14 +53,14 @@ | Avancerad AI-integration (veckoplanering, receptförslag) | ❌ Planerad | | EAN-skanning via Open Food Facts API | ❌ Planerad | -## Status — senast genomgånget: 2026-04-22 +## Status — senast genomgånget: 2026-04-30 ### Nyheter och förbättringar +- **Microservice-importer integrerad (2026-04-30)** — All import-logik (URL-skrapning, OCR, PDF-parsning, AI-kvittoparsning) delegeras nu till `importer-api` som körs som intern Docker-tjänst. `recipe-api` behåller Levenshtein-matchning, produktdatabas och AI-kategorisering. Se [migrering-MSI.md](migrering-MSI.md) för detaljer. - **User-scope för pantry och matplan** — Alla baslager- och matplansdata är nu per användare. Backend och Prisma-schema är migrerade. - **Robust bildimport** — Bild-URL normaliseras, laddas ner och optimeras i backend. Bilden kopplas till receptet och raderas vid delete. Diagnostikloggning på alla steg. - **Importflöde** — Quick-import och receipt-import har förbättrats med robust multipart-hantering, timeout, och felhantering. Markdown och bild-url skickas hela vägen till UI. - **Flutter-parity** — Matplan, inventarie, baslager och receptflöden är nu fullt migrerade till Flutter med user-scope och robust felhantering. -- **Felsökningslogg** — Se `IMPORT_IMAGE_DEBUG_2026-04-22.md` för detaljerad felsökningshistorik kring bildimport och importflöde. ### Kända begränsningar - Kvittoimport (Fas 6b) är påbörjad men granskningssteg och bulk-spara återstår. diff --git a/TEKNISK_BESKRIVNING.md b/TEKNISK_BESKRIVNING.md index 0be4b658..65e83af9 100644 --- a/TEKNISK_BESKRIVNING.md +++ b/TEKNISK_BESKRIVNING.md @@ -15,6 +15,11 @@ sker på remote server. Säkerställ att inga absoluta Windows-sökvägar anv --- +## Nyheter och förbättringar (2026-04-30) + +- **Microservice-importer integrerad** — `importer-api` körs nu som intern Docker-tjänst i `recipe-app/compose.yml`. All URL-skrapning, OCR, PDF-parsning och AI-kvittoparsning delegeras dit. `recipe-api` behåller Levenshtein-matchning, produktdatabas och AI-kategorisering. Se [migrering-MSI.md](migrering-MSI.md) för fullständig lista över ändrade filer. +- **Bygg-instruktion** — Katalogen `../microservice-importer` måste finnas sida vid sida med `recipe-app` på servern. `./deploy.sh` bygger båda automatiskt. + ## Nyheter och förbättringar (2026-04-22) - **User-scope för pantry och matplan** — Prisma-schema, backend och API är migrerade så att alla baslager- och matplansdata är per användare. JWT används för filtrering i alla endpoints. diff --git a/migrering-MSI.md b/migrering-MSI.md index 26513f77..91f741f7 100644 --- a/migrering-MSI.md +++ b/migrering-MSI.md @@ -1,11 +1,107 @@ # Migrering: Import-funktion → microservice-importer -## Beslut +## Status: ✅ GENOMFÖRD 2026-04-30 - **Scope:** quick-import, parse-markdown, receipt-import - **Arkitektur:** Backend-till-backend — recipe-app NestJS-backend anropar microservice-importer internt via HTTP. Frontend ändras inte. -- **OCR:** Läggs till i microservice-importer (tesseract.js) -- **Infra:** Separata Docker Compose-filer, microservice-importer på port 3001 +- **OCR:** Implementerat i microservice-importer (tesseract.js + Alpine apk-paket) +- **Infra:** `importer-api`-tjänst i `recipe-app/compose.yml`, port 3001 intern +- **Driftsatt:** 2026-04-30, alla containers Healthy + +--- + +## Fas 1 — Utöka microservice-importer ✅ + +**1. OCR-stöd och multipart i quick-import** ✅ +- `QuickImportService.importFromUpload()` tillagd — hanterar PDF (pdf-parse) och bild (tesseract.js) +- `quick-import.controller.ts` utökat med `FileInterceptor`, `@HttpCode(200)` +- `Dockerfile` uppdaterad: `apk add tesseract-ocr tesseract-ocr-data-swe tesseract-ocr-data-eng` + +**2. `imageUrl` i quick-import-svaret** ✅ +- `imageUrl?: string` tillagd i `ParsedRecipe`-interfacet (`base.parser.ts`) +- ICA-parsern extraherar nu `recipe.image` (string/array/objekt-varianter) +- `QuickImportResult` utökad med `imageUrl?`, `imageWarning?`, source `'image'` +- `normalizeImageUrl()` hanterar protokollrelativa URL:er (`//cdn.ica.se/...`) + +**3. Ny `ReceiptParsingModule`** ✅ +- `backend/src/receipt-parsing/receipt-parsing.service.ts` — Mistral AI-parsning av kvitto (bild/PDF) +- `backend/src/receipt-parsing/receipt-parsing.controller.ts` — `POST /api/receipt-import/parse`, `@HttpCode(200)`, tillåter `application/octet-stream` +- `backend/src/receipt-parsing/receipt-parsing.module.ts` +- Registrerad i `app.module.ts` + +**4. Health-endpoint** ✅ +- `GET /api/health` → `{status: "ok"}` inline i `app.module.ts` + +**5. Bugfixar i document-service** ✅ +- `document-service.module.ts`: korrigerade importvägar + klassnamn (`DocumentImportModule` → `DocumentServiceModule`) +- `services/document-import.service.ts`: parsersökväg `./parsers/` → `../parsers/` +- Borttagna dubbletter: `services/web-scraping.module.ts`, `services/document-service.module.ts` + +--- + +## Fas 2 — Anpassa recipe-app backend ✅ + +**5. Refaktorera `QuickImportService`** ✅ +- All lokal parsning (ICA, pdf-parse, tesseract) borttagen +- Delegerar URL-import: `POST importer-api:3001/api/quick-import` (JSON) +- Delegerar filuploading: `POST importer-api:3001/api/quick-import` (FormData, `new Uint8Array(file.buffer)`) +- `downloadAndOptimizeImage()` behålls lokalt (körs efter microservice returnerat `imageUrl`) +- `IMPORTER_SERVICE_URL` env-variabel med fallback `http://importer-api:3001` + +**6. Refaktorera `ReceiptImportService`** ✅ +- AI-parsning (Mistral, pdf-parse) borttagen ur recipe-app +- Delegerar till `POST importer-api:3001/api/receipt-import/parse` (FormData) +- `matchProducts()` och `enrichWithAiCategories()` behålls (DB-krav) +- `RECEIPT_IMPORT_MODEL`-konstanten flyttad till `ai.controller.ts` (lokal konstant) + +**7. Refaktorera `RecipesService.parseMarkdown()`** ✅ +- Delegerar markdown-parsning till `POST importer-api:3001/api/recipes/parse-markdown` +- Fallback till lokal `parseRecipeMarkdown()` vid driftavbrott +- Levenshtein-produktmatchning behålls lokalt + +--- + +## Fas 3 — Infrastruktur ✅ + +**8. `importer-api` i `recipe-app/compose.yml`** ✅ +- Build-context: `../microservice-importer`, dockerfile `backend/Dockerfile` +- Image: `recipe-importer-api:local`, `pull_policy: never` +- Nätverk: `recipe-internal` (ej exponerad externt) +- Env: `MISTRAL_API_KEY`, `PORT=3001` +- Healthcheck: `wget -qO- http://127.0.0.1:3001/api/health` +- `recipe-api` får `depends_on: importer-api: condition: service_healthy` + +--- + +## Relevanta filer som ändrades + +| Fil | Förändring | +|---|---| +| `microservice-importer/backend/src/web-scraping-service/parsers/base.parser.ts` | `imageUrl?` i `ParsedRecipe` | +| `microservice-importer/backend/src/web-scraping-service/parsers/ica.parser.ts` | Extraherar `recipe.image` | +| `microservice-importer/backend/src/web-scraping-service/services/quick-import.service.ts` | Omskriven: OCR, PDF, imageUrl, importFromUpload | +| `microservice-importer/backend/src/web-scraping-service/controllers/quick-import.controller.ts` | FileInterceptor, HttpCode(200) | +| `microservice-importer/backend/src/web-scraping-service/web-scraping.module.ts` | Fixade importvägar + klassnamn | +| `microservice-importer/backend/src/document-service/document-service.module.ts` | Fixade importvägar + klassnamn | +| `microservice-importer/backend/src/document-service/services/document-import.service.ts` | Fixad parsersökväg | +| `microservice-importer/backend/src/receipt-parsing/` | Ny modul (service, controller, module) | +| `microservice-importer/backend/src/app.module.ts` | ReceiptParsingModule + HealthController | +| `microservice-importer/backend/Dockerfile` | apk add tesseract-ocr | +| `recipe-app/backend/src/quick-import/quick-import.service.ts` | Delegerar till importer-api | +| `recipe-app/backend/src/receipt-import/receipt-import.service.ts` | AI-del delegeras, matchning behålls | +| `recipe-app/backend/src/recipes/recipes.service.ts` | parseMarkdown delegeras, matchning behålls | +| `recipe-app/backend/src/ai/ai.controller.ts` | RECEIPT_IMPORT_MODEL lokal konstant | +| `recipe-app/compose.yml` | importer-api-tjänst tillagd | + +--- + +## Avgränsningar (oförändrade) + +- **Frontend ändras inte** — samma proxy-routes, samma API-kontrakt +- **Auth stannar i recipe-app backend** — microservice-importer exponeras bara internt +- **Bildoptimering** behålls i recipe-app (`downloadAndOptimizeImage` vid `RecipesService.create()`) +- `matchProducts()` och `enrichWithAiCategories()` stannar i recipe-app (DB-krav) + ---