Files
recipe-app/migrering-MSI.md
T

4.7 KiB
Raw Blame History

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 13 ä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 57 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 57 ä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

  1. POST /api/quick-import (recipe-app backend) med ICA-URL → samma svar som idag
  2. POST /api/quick-import med PDF-fil → samma svar
  3. POST /api/recipes/parse-markdown med markdown → ingredienser med produkt-ID:n
  4. POST /api/receipt-import med kvittobild → matchade items med DB-produkt-ID:n
  5. Autentisering fungerar (hanteras av recipe-app backend som tidigare)
  6. docker compose up startar 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-import splittad: AI-del → microservice, produktmatchning + DB → recipe-app backend