feat: Enhance README and technical description with quick-import module details and parser architecture

This commit is contained in:
Nils-Johan Gynther
2026-04-12 17:09:40 +02:00
parent 8fe9a7a4d2
commit e90fd2d670
2 changed files with 74 additions and 4 deletions
+34 -1
View File
@@ -94,10 +94,43 @@ Klistra in:
**Stödda webbplatser:** **Stödda webbplatser:**
- ICA.se — Recept skrapas automatiskt - ICA.se — Recept skrapas automatiskt
- Andra webbplatser — Generic HTML-parser (JSON-LD först, sedan HTML-fallback)
- (PDF-import under utveckling) - (PDF-import under utveckling)
**Felmeddelandena vägleder dig:** **Felmeddelandena vägleder dig:**
- "Länken är inte från ICA.se" — Endast ICA stöds för närvarande - "Länken är inte från ICA.se" — Försöker Generic parser istället
> **Notering:** Snabbimport-logiken är också tillgänglig som en **[standalone microservice](../microservice-importer/README.md)** för integrations- eller API-använding.
---
## Arkitektur: Recipe App + Microservice Importer
Recipe App är uppbyggd i två komponenter:
### Recipe App (detta repo)
**Fullstack-applikation:** Frontend (Next.js), Backend (NestJS), Databas (MariaDB)
Innehåller:
- Inventorie-hantering (CRUD, konsumtion, history)
- Recept-hantering (CRUD, matchning mot inventorie)
- Produktadmin (merge, duplicates, canonical names)
- **Quick-import** (ICA-skrapning integrerad i `/recipes/create`)
### Microservice Importer (separat repo)
**Standalone-tjänst:** Frontend (Next.js), Backend (NestJS, INGEN databas)
Innehåller:
- **URL-scraping:** ICA.se + generic HTML-parser
- **Markdown-parsing:** Samma parser-logik som recipe-app
- Eget kontrollpanel på `/import`
**Användningsfall:**
- Extern API-integration (POST `http://microservice:3001/api/quick-import`)
- Oberoende snabbimport-webb-UI
- Muligt att scalea separat från recipe-app
**Repo:** [`microservice-importer`](../microservice-importer/)
- "Kunde inte hämta recept från ICA: ..." — Länken är bruten eller receptet kunde inte parsas - "Kunde inte hämta recept från ICA: ..." — Länken är bruten eller receptet kunde inte parsas
- "Du måste ange en URL eller filsökväg" — Fältet var tomt - "Du måste ange en URL eller filsökväg" — Fältet var tomt
+40 -3
View File
@@ -127,10 +127,14 @@ backend/src/
│ ├── update-product.dto.ts │ ├── update-product.dto.ts
│ ├── merge-products.dto.ts │ ├── merge-products.dto.ts
│ └── update-canonical-name.dto.ts │ └── update-canonical-name.dto.ts
├── quick-import/ # NYT: Snabbimport-modul ├── quick-import/ # 🆕 Snabbimport-modul
│ ├── quick-import.controller.ts # POST /api/quick-import │ ├── quick-import.controller.ts # POST /api/quick-import
│ ├── quick-import.service.ts # ICA-skrapning, PDF-stöd │ ├── quick-import.service.ts # ICA-skrapning, URL-parsing
── quick-import.module.ts # Module definition ── quick-import.module.ts # Module definition
│ └── parsers/
│ ├── base.parser.ts # Abstract RecipeParser class
│ ├── ica.parser.ts # ICA.se-specifik parser (JSON-LD)
│ └── generic.parser.ts # Fallback-parser (HTML + JSON-LD)
└── recipes/ └── recipes/
├── recipes.controller.ts # Recept endpoints ├── recipes.controller.ts # Recept endpoints
├── recipes.service.ts # Recept + Markdown-parsing ├── recipes.service.ts # Recept + Markdown-parsing
@@ -148,6 +152,22 @@ backend/src/
- Databasspecifik hälsokontroll (responseTime, connection test) - Databasspecifik hälsokontroll (responseTime, connection test)
- Returnerar statusCode 200 eller 503 - Returnerar statusCode 200 eller 503
**Quick-Import API:** 📌 (Även tillgänglig via [Microservice Importer](../microservice-importer/))
- **Endpoint:** `POST /api/quick-import`
- **Input:** URL (t.ex. `https://ica.se/recept/...`) eller filsökväg (PDF)
- **Process:**
1. URL-validering (HTTP fetch med User-Agent)
2. Parser-urval baserat på `canHandle(url)`
3. HTML-parsing och receptextraktion
4. Markdown-konvertering med källlänk i footer
- **Parser-arkitektur:**
- **Base Parser** (`RecipeParser`): Abstract class med gemensam parseIngredientLine()-logik
- Hanterar bråkmängder (1 1/2 dl), parentetiska noter, unit-validering
- Kända enheter: g, kg, hg, mg, ml, dl, l, tl, st, tsk, msk, krm, port, efter smak, förp, klyfta, m.fl.
- **ICA Parser** (`IcaRecipeParser`): Prioriterar JSON-LD structured data, fallback HTML
- **Generic Parser** (`GenericRecipeParser`): Försöker alla webbplatser (JSON-LD → HTML)
- **Output:** Markdown-format recepttext (namn, beskrivning, ingredienser, instruktioner, källa)
**Inventarie-API:** **Inventarie-API:**
- CRUD för inventarieföremål (produktreferens, kvantitet, enhet, plats, märke, bäst före, mm) - CRUD för inventarieföremål (produktreferens, kvantitet, enhet, plats, märke, bäst före, mm)
- Konsumtionshistorik-tracking (registrera brukat amount och kommentar) - Konsumtionshistorik-tracking (registrera brukat amount och kommentar)
@@ -710,3 +730,20 @@ Konfigureras via `.env` eller `docker compose up`:
- Recept-delning - Recept-delning
- Nutrition facts - Nutrition facts
- Allergi-tracking - Allergi-tracking
---
## Framtida arkitektur: Microservice Importer
Recipe App har ett **companion-projekt** för receptimport: [`microservice-importer`](../microservice-importer/)
### Nuläge
Quick-import-funktionen är för närvarande **integrerad i Recipe App** med full funktionalitet.
### Framtida möjlighet
I framtiden kan snabbimport-logiken extraheras till en **standalone microservice** för:
- Oberoende scaling
- Enklare API-integration med andra system
- Lägre komplexitet (ingen databaskonfiguration)
Se [microservice-importer README](../microservice-importer/README.md) för komplett dokumentation och deployment-instruktioner när separation blir aktuell.