Update to .md-files
This commit is contained in:
+99
-3
@@ -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)
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user