From e90fd2d6701ea5db66033a4eaf5cdbe3c0c1042c Mon Sep 17 00:00:00 2001 From: Nils-Johan Gynther Date: Sun, 12 Apr 2026 17:09:40 +0200 Subject: [PATCH] feat: Enhance README and technical description with quick-import module details and parser architecture --- README.md | 35 +++++++++++++++++++++++++++++++++- TEKNISK_BESKRIVNING.md | 43 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3d0a95d5..0519aab8 100644 --- a/README.md +++ b/README.md @@ -94,10 +94,43 @@ Klistra in: **Stödda webbplatser:** - ICA.se — Recept skrapas automatiskt +- Andra webbplatser — Generic HTML-parser (JSON-LD först, sedan HTML-fallback) - (PDF-import under utveckling) **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 - "Du måste ange en URL eller filsökväg" — Fältet var tomt diff --git a/TEKNISK_BESKRIVNING.md b/TEKNISK_BESKRIVNING.md index 94ac454b..88636754 100644 --- a/TEKNISK_BESKRIVNING.md +++ b/TEKNISK_BESKRIVNING.md @@ -127,10 +127,14 @@ backend/src/ │ ├── update-product.dto.ts │ ├── merge-products.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.service.ts # ICA-skrapning, PDF-stöd -│ └── quick-import.module.ts # Module definition +│ ├── quick-import.service.ts # ICA-skrapning, URL-parsing +│ ├── 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.controller.ts # Recept endpoints ├── recipes.service.ts # Recept + Markdown-parsing @@ -148,6 +152,22 @@ backend/src/ - Databasspecifik hälsokontroll (responseTime, connection test) - 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:** - CRUD för inventarieföremål (produktreferens, kvantitet, enhet, plats, märke, bäst före, mm) - Konsumtionshistorik-tracking (registrera brukat amount och kommentar) @@ -710,3 +730,20 @@ Konfigureras via `.env` eller `docker compose up`: - Recept-delning - Nutrition facts - 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.