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:
@@ -1,16 +0,0 @@
|
|||||||
NODE_ENV=production
|
|
||||||
|
|
||||||
NEXT_PUBLIC_APP_URL=https://recept.gynther.se
|
|
||||||
NEXT_PUBLIC_API_URL=https://api.recept.gynther.se
|
|
||||||
|
|
||||||
MARIADB_ROOT_PASSWORD=Encrust6-Deserve-Stricken-Spectacle
|
|
||||||
MARIADB_DATABASE=recipe_app
|
|
||||||
MARIADB_USER=recipe_user
|
|
||||||
MARIADB_PASSWORD=Imminent-Umpire-Undertook8-Crunchy
|
|
||||||
|
|
||||||
# Använder root för att prisma migrate deploy skall fungera
|
|
||||||
DATABASE_URL=mysql://root:Encrust6-Deserve-Stricken-Spectacle@recipe-db:3306/recipe_app
|
|
||||||
|
|
||||||
MISTRAL_API_KEY=ciPqxezMHmzkLwdqMGBI1jjpngFfqpl1
|
|
||||||
JWT_SECRET=UfRHKQ3ZTKF3TCJP7FRm+r9PRc0ANyFl52aPrQXGCE8=
|
|
||||||
AUTH_SECRET=pISXR/rkXqBBDv1FRxF3ESP1PwUspSt05PkC5/hK/y4=
|
|
||||||
@@ -170,6 +170,15 @@ AI-infrastrukturen är nu på plats (`AiService`, `mistral-small-2603`, premium-
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Enhetsstöd och konvertering
|
||||||
|
|
||||||
|
- Se över om vi behöver utöka antalet stödda enhetstyper (t.ex. fler volym- eller portionsenheter)
|
||||||
|
- Utveckla och förbättra normaliseringen i `recipeservice.normalizeUnit`
|
||||||
|
- Se över och testa konverteringslogiken för enheter (t.ex. edge cases, felhantering)
|
||||||
|
- Fundera på om AI kan användas för att tolka, normalisera eller konvertera enheter och mängder smartare
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Enhetstester
|
## Enhetstester
|
||||||
|
|
||||||
Jest + ts-jest är uppsatt. Tester finns för:
|
Jest + ts-jest är uppsatt. Tester finns för:
|
||||||
|
|||||||
+49
-54
@@ -659,7 +659,7 @@ POST /api/pantry Lägg till produkt i baslagret
|
|||||||
DELETE /api/pantry/:id Ta bort produkt från 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
|
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)
|
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**
|
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
|
#### Kategori- och produktseed
|
||||||
|
|
||||||
@@ -1006,49 +1006,9 @@ Stek löken i lite smör. Tillsätt köttfärsen…
|
|||||||
|
|
||||||
### Komponenter och dataflöde
|
### 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
|
#### 2. Backend: `POST /api/recipes/parse-markdown` endpoint
|
||||||
|
|
||||||
**Klassbank:**
|
|
||||||
- `recipe-document-converter` — Markdown-parser
|
|
||||||
- `@prisma/client` — Databasaccess
|
- `@prisma/client` — Databasaccess
|
||||||
- Common utils: `normalize-name.ts`
|
- Common utils: `normalize-name.ts`
|
||||||
|
|
||||||
@@ -1262,11 +1222,6 @@ För varje ingrediens:
|
|||||||
|
|
||||||
### Backend-Dockerfile (3-stage build)
|
### 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**
|
**Stage 2: builder**
|
||||||
```dockerfile
|
```dockerfile
|
||||||
@@ -1284,7 +1239,6 @@ FROM node:22-alpine AS runner
|
|||||||
# Enbart dist/, node_modules/, prisma/
|
# 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:
|
Build-kommando:
|
||||||
```bash
|
```bash
|
||||||
@@ -1386,7 +1340,7 @@ docker exec recipe-db mariadb -uroot -p"$DB_PASS" recipe_app -e "SHOW TABLES;"
|
|||||||
|
|
||||||
### Kategoristruktur
|
### Kategoristruktur
|
||||||
|
|
||||||
**Nivå 1 (Toppkategorier):**
|
**Nivå 1 (Toppkategorier, exempel):**
|
||||||
- Bröd & Kakor
|
- Bröd & Kakor
|
||||||
- Dryck
|
- Dryck
|
||||||
- Färdigmat
|
- 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
|
- Kött, chark & fågel
|
||||||
- Mejeri, ost & ägg
|
- Mejeri, ost & ägg
|
||||||
- Skafferi
|
- Skafferi
|
||||||
- Fisk & Skaldjur *(tillagd senare)*
|
- Fisk & Skaldjur
|
||||||
- Vegetariskt *(tillagd senare)*
|
- Vegetariskt
|
||||||
|
|
||||||
**Nivå 2 (Underkategorier, exempel):**
|
**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
|
- 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):**
|
**Nivå 3 (Specifika kategorier, exempel):**
|
||||||
- Bröd & Kakor > Bröd > Matbröd, Rostbröd
|
- 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
|
### 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/)
|
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
|
- Oberoende scaling
|
||||||
- Enklare API-integration med andra system
|
- Enklare API-integration med andra system
|
||||||
- Lägre komplexitet (ingen databaskonfiguration)
|
- 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.
|
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).
|
||||||
|
|
||||||
|
---
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Flytta manuellt mappen recipe-document-converter till _archive/recipe-document-converter. Verktyget kan inte flytta kataloger automatiskt i denna miljö.
|
||||||
Reference in New Issue
Block a user