4.7 KiB
Migrering: Import-funktion → microservice-importer
Beslut
- 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
Fas 1 — Utöka microservice-importer
Steg 1–3 är oberoende och kan utföras parallellt.
1. Lägg till OCR-stöd (tesseract.js)
Ny ImageParser i backend/src/web-scraping-service/parsers/. Controllern
quick-import.controller.ts utökas att acceptera multipart/form-data för
bilder vid sidan av JSON-body för URL-anrop.
2. Lägg till imageUrl i quick-import-svaret
quick-import.service.ts returnerar idag { markdown, source }. Komplettera
med imageUrl? (original-URL från skrapad sida).
3. Ny ReceiptParsingModule – stateless kvittoparsning
Ny modul backend/src/receipt-parsing/ med endpoint POST /api/receipt-import/parse.
- PDF → text via
pdf-parse; bild → base64 - Anropar Mistral AI med kvitto-prompt
- Returnerar:
[{ rawName, quantity, unit, price, brand, origin }] - Ingen databaskoppling — rent stateless
Fas 2 — Anpassa recipe-app backend
Beror på Fas 1. Steg 5–7 kan utföras parallellt.
4. Lägg till HttpModule + IMPORTER_SERVICE_URL
recipe-app backend registrerar NestJS:s HttpModule (axios-wrapper).
IMPORTER_SERVICE_URL sätts som env-variabel (http://importer-api:3001 i Docker).
5. Refaktorera QuickImportService
Ta bort lokal ICA-parsning, pdf-parse och tesseract — anropa istället
microservice-importer POST /api/quick-import (eller POST /api/document-import
för PDF). QuickImportModule behåller sin controller och DTO (API-kontrakt oförändrat).
6. Refaktorera ReceiptImportService
- AI-parsning → delegeras till
POST $IMPORTER_URL/api/receipt-import/parse - Produktmatchning (Levenshtein mot
Product,ReceiptAlias) — behålls i recipe-app (DB-krav) - Slår ihop och returnerar samma svar som idag till frontend
7. Refaktorera RecipesService.parseMarkdown()
- Anropar
POST $IMPORTER_URL/api/recipes/parse-markdown→{ name, ingredients[], ... } - Kör befintlig Levenshtein-produktmatchning mot
Product-tabellen i recipe-app - Returnerar sammansatt svar — API-kontraktet mot frontend oförändrat
8. Ta bort lokala parsningsberoenden
Ta bort pdf-parse, tesseract.js, node-fetch etc. ur recipe-app backend
package.json när steg 5–7 är verifierade.
Fas 3 — Infrastruktur
Kan påbörjas parallellt med Fas 1.
9. Länka microservice-importer i recipe-app:s Docker Compose
Lägg till importer-api-tjänst i recipe-app/compose.yml (byggs från
../microservice-importer/backend). Delar recipe-network med recipe-app
backend. Sätt IMPORTER_SERVICE_URL=http://importer-api:3001 i recipe-app
backend-tjänstens env.
Relevanta filer
| Fil | Förändring |
|---|---|
microservice-importer/backend/src/web-scraping-service/ |
Ny ImageParser, imageUrl i svar |
microservice-importer/backend/src/ |
Ny receipt-parsing/ modul |
recipe-app/backend/src/quick-import/quick-import.service.ts |
Ersätt lokal parsning med HTTP-anrop |
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/app.module.ts |
Registrera HttpModule |
recipe-app/backend/package.json |
Ta bort pdf-parse, tesseract.js |
recipe-app/compose.yml |
Lägg till importer-api tjänst |
recipe-app/frontend/ |
Ändras inte |
Verifiering
POST /api/quick-import(recipe-app backend) med ICA-URL → samma svar som idagPOST /api/quick-importmed PDF-fil → samma svarPOST /api/recipes/parse-markdownmed markdown → ingredienser med produkt-ID:nPOST /api/receipt-importmed kvittobild → matchade items med DB-produkt-ID:n- Autentisering fungerar (hanteras av recipe-app backend som tidigare)
docker compose upstartar microservice-importer som intern tjänst
Avgränsningar
- Frontend ändras inte — samma proxy-routes, samma API-kontrakt
- Auth stannar i recipe-app backend — microservice-importer exponeras bara internt på Docker-nätverket
- Bildoptimering vid sparande behålls i recipe-app (sker vid
RecipesService.create(), inte vid import) receipt-importsplittad: AI-del → microservice, produktmatchning + DB → recipe-app backend