Ta bort alla referenser till recipe-document-converter från dokumentation och kodbas

Lägg till riktlinje att båda microservices (importer och shopping/todo-lista) ska använda SQLite för portabilitet och enkelhet
Förtydliga att microservices ska dela teknisk grund med recipe-app: JWT-baserad autentisering, rollhantering och API-design
This commit is contained in:
Nils-Johan Gynther
2026-04-20 15:24:15 +02:00
parent 41a5170ed2
commit 361847b337
9 changed files with 59 additions and 70 deletions
+49 -54
View File
@@ -659,7 +659,7 @@ POST /api/pantry Lägg till produkt i baslagret
DELETE /api/pantry/:id Ta bort produkt från baslagret
```
### 🗓️ Matplan-endpoints
### 🗓️ Matplan/matsedel-endpoints
```
GET /api/meal-plan?from=YYYY-MM-DD&to=YYYY-MM-DD Lista planerade recept för datumintervall
POST /api/meal-plan Skapa eller uppdatera post (upsert per datum)
@@ -728,7 +728,7 @@ model Category {
}
```
Hierarkin har 3 nivåer: **Huvudkategori → Underkategori → Typ**
Exempelträd: `Mejeri, ost & ägg → Mjölk → Laktosfri mjölk`
Exempelträd: `Mejeri, ost & ägg → Mjölk → Standard mjölk`
#### Kategori- och produktseed
@@ -1006,49 +1006,9 @@ Stek löken i lite smör. Tillsätt köttfärsen…
### Komponenter och dataflöde
#### 1. `recipe-document-converter/` bibliotek
**Modulstruktur:**
- `src/parser.ts` — Markdown-parser med ingrediensparsning
- `src/index.ts` — Biblioteksexport
- `package.json` — npm-paket (noll externa beroenden)
- `tsconfig.json` — TypeScript-konfiguration
**Huvudexport:**
```typescript
export function parseRecipeMarkdown(markdown: string): ParsedRecipe
interface ParsedRecipe {
name: string;
description: string; # Kan vara tom
instructions: string; # Kan vara tom
ingredients: ParsedIngredient[];
}
interface ParsedIngredient {
rawName: string; # Extraherat ingrediensnamn
quantity: number; # Numerisk kvantitet (eller 0 om ingen)
unit: string; # Enhet (eller "" om ingen)
note: string | null; # Text i parentes (eller null)
}
```
**Ingrediensparsning i detalj:**
- Försöker matcha regex `(\d+(?:[.,]\d+)?)\s+(\S+)\s+(.+)` för "ANTAL ENHET NAMN"
- Fallback: `(\d+(?:[.,]\d+)?)\s+(.+)` för "ANTAL NAMN" (unit → "st")
- Fallback: bara namn, quantity=0, unit=""
- Kommatecken i tal: `,` → `.` (t.ex. "1,5" blir 1.5)
- Parentes-extraktion: Matchar sista `(text)` i raden
**Byggning:**
- TypeScript → JavaScript via `tsc`
- Separerad npm-modul
- Kompileras i Docker-build steg 1 (converter-build)
#### 2. Backend: `POST /api/recipes/parse-markdown` endpoint
**Klassbank:**
- `recipe-document-converter` — Markdown-parser
- `@prisma/client` — Databasaccess
- Common utils: `normalize-name.ts`
@@ -1262,11 +1222,6 @@ För varje ingrediens:
### Backend-Dockerfile (3-stage build)
**Stage 1: converter-build**
```dockerfile
FROM node:22-alpine AS converter-build
# Bygg recipe-document-converter biblioteket
```
**Stage 2: builder**
```dockerfile
@@ -1284,7 +1239,6 @@ FROM node:22-alpine AS runner
# Enbart dist/, node_modules/, prisma/
```
**Viktigt:** `backend/package.json` har `"recipe-document-converter": "file:../recipe-document-converter"` för lokal dev. I Docker ignoreras denna; convertern kopieras in från stage 1.
Build-kommando:
```bash
@@ -1386,7 +1340,7 @@ docker exec recipe-db mariadb -uroot -p"$DB_PASS" recipe_app -e "SHOW TABLES;"
### Kategoristruktur
**Nivå 1 (Toppkategorier):**
**Nivå 1 (Toppkategorier, exempel):**
- Bröd & Kakor
- Dryck
- Färdigmat
@@ -1396,16 +1350,18 @@ docker exec recipe-db mariadb -uroot -p"$DB_PASS" recipe_app -e "SHOW TABLES;"
- Kött, chark & fågel
- Mejeri, ost & ägg
- Skafferi
- Fisk & Skaldjur *(tillagd senare)*
- Vegetariskt *(tillagd senare)*
- Fisk & Skaldjur
- Vegetariskt
**Nivå 2 (Underkategorier, exempel):**
- Bröd & Kakor > Bröd, Fastfoodbröd, Kex & Kakor, Knäckebröd & Skorpor
- Bröd & Kakor > Bröd, Matbröd, Rostbröd,Fastfoodbröd, Kex & Kakor, Knäckebröd & Skorpor
- Mejeri, ost & ägg > Ost, Allergi mejeri, Mjölk, Filmjölk & Yoghurt, Matlagning, Smör/margarin & jäst, Havre-/Soja-/Risdryck, Kvarg & Cottage cheese
- Frukt & Grönt > Grönsaker
**Nivå 3 (Specifika kategorier, exempel):**
- Bröd & Kakor > Bröd > Matbröd, Rostbröd
- Frukt & Grönt > Grönsaker > Sallad & Kål, Auberginer & Zucchini, Paprika, Övriga grönsaker, Tomater
- Mejeri, ost & ägg > Mjölk > Standard mjölk
- Frukt & Grönt > Grönsaker > Sallad & Kål
### Uppdatering av kategorier
@@ -1420,7 +1376,9 @@ Produkterna behålls och omkategoriseras enligt de nya UPDATE-satserna.
---
## Framtida arkitektur: Microservice Importer
# Framtida projekt - Companion-projekt
## Microservice Importer
Recipe App har ett **companion-projekt** för receptimport: [`microservice-importer`](../microservice-importer/)
@@ -1432,5 +1390,42 @@ I framtiden kan snabbimport-logiken extraheras till en **standalone microservice
- Oberoende scaling
- Enklare API-integration med andra system
- Lägre komplexitet (ingen databaskonfiguration)
- Docker kontainer
Se [microservice-importer README](../microservice-importer/README.md) för komplett dokumentation och deployment-instruktioner när separation blir aktuell.
### Arkitektur för Microservice Importer
Se ovan samt nedan: Gemensam arkitektur för companion-projekt
## Microservice Shopping/Todo-lista
En möjlig framtida utveckling är ett separat companion-projekt till Recipe App i form av en **standalone microservice för shopping/todo-lista**. Denna tjänst ska:
- Vara helt oberoende av Recipe App, men kunna interagera med den
- Erbjuda sömlös integrering mellan sig själv och Recipe App
- Inte kräva någon avancerad databaskonfiguration, utan endast använda en enkel filbaserad databaslösning inom appen
- Docker kontainer
Syftet är att möjliggöra delad eller fristående användning av shopping/todo-listor, med enkel integration för användare som vill koppla ihop funktionaliteten med Recipe App.
### Arkitektur för Microservice Shopping/Todo-lista
Se ovan samt nedan: Gemensam arkitektur för companion-projekt
## Gemensam arkitektur för companion-projekten
**Databasval:**
Companion-projekten ska använda SQLite som databas, eftersom det möjliggör återanvändning av datamodell och queries mellan backend och native app (iOS/Android). SQLite stöds direkt i Node.js, iOS och Android och gör det enkelt att dela databasstruktur och logik mellan olika plattformar.
**Gemensam teknisk grund och säkerhet:**
Både microservice-importer och companion-projektet för shopping/todo-lista ska dela teknisk grund med recipe-app, särskilt vad gäller säkerhetslösningar och API-hantering. Detta innebär:
- JWT-baserad autentisering och rollhantering, med tokens som används för att skydda API-endpoints
- API-design enligt REST-principer, med tydlig separation mellan autentiserade och publika endpoints
- Proxy-lösning (Caddy) för att styra trafik och säkerställa att rätt endpoints skyddas
- Återanvändning av auth-middleware och utility-funktioner för tokenhantering
- Felhantering och svar i JSON-format
I recipe-app används Auth.js v5 (NextAuth) för autentisering, JWT-sessioner, och globala guards i backend (NestJS) för att skydda alla API-routes. Frontend och backend kommunicerar via tydliga API-routes, och klientkomponenter använder utility-funktioner för att alltid skicka med rätt auth-token. Samma principer och kodmönster ska tillämpas i båda microservices för enhetlig säkerhet och API-hantering.
**Databasval:**
Microservice-importer ska använda SQLite som databas, av samma skäl som companion-projektet för shopping/todo-lista: enkel filbaserad setup, portabilitet och möjlighet att återanvända datamodell och queries mellan backend och native app (iOS/Android).
---