feat: migrate import functionality to microservice-importer for quick-import, receipt parsing, and markdown parsing
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
# 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
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user