From 361847b33710dc4c134cae27edc58b28ec1e9469 Mon Sep 17 00:00:00 2001 From: Nils-Johan Gynther Date: Mon, 20 Apr 2026 15:24:15 +0200 Subject: [PATCH] =?UTF-8?q?Ta=20bort=20alla=20referenser=20till=20recipe-d?= =?UTF-8?q?ocument-converter=20fr=C3=A5n=20dokumentation=20och=20kodbas=20?= =?UTF-8?q?L=C3=A4gg=20till=20riktlinje=20att=20b=C3=A5da=20microservices?= =?UTF-8?q?=20(importer=20och=20shopping/todo-lista)=20ska=20anv=C3=A4nda?= =?UTF-8?q?=20SQLite=20f=C3=B6r=20portabilitet=20och=20enkelhet=20F=C3=B6r?= =?UTF-8?q?tydliga=20att=20microservices=20ska=20dela=20teknisk=20grund=20?= =?UTF-8?q?med=20recipe-app:=20JWT-baserad=20autentisering,=20rollhanterin?= =?UTF-8?q?g=20och=20API-design?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.2026-04-18 | 16 --- NEXT_STEPS.md | 9 ++ TEKNISK_BESKRIVNING.md | 103 +++++++++--------- ...copilot_move_recipe-document-converter.txt | 1 + add_to_seed.txt => _archive/add_to_seed.txt | 0 .../recipe-document-converter}/package.json | 0 .../recipe-document-converter}/src/index.ts | 0 .../recipe-document-converter}/src/parser.ts | 0 .../recipe-document-converter}/tsconfig.json | 0 9 files changed, 59 insertions(+), 70 deletions(-) delete mode 100644 .env.2026-04-18 create mode 100644 _archive/.copilot_move_recipe-document-converter.txt rename add_to_seed.txt => _archive/add_to_seed.txt (100%) rename {recipe-document-converter => _archive/recipe-document-converter}/package.json (100%) rename {recipe-document-converter => _archive/recipe-document-converter}/src/index.ts (100%) rename {recipe-document-converter => _archive/recipe-document-converter}/src/parser.ts (100%) rename {recipe-document-converter => _archive/recipe-document-converter}/tsconfig.json (100%) diff --git a/.env.2026-04-18 b/.env.2026-04-18 deleted file mode 100644 index 961d8565..00000000 --- a/.env.2026-04-18 +++ /dev/null @@ -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= diff --git a/NEXT_STEPS.md b/NEXT_STEPS.md index 9b35dff9..a78cfeda 100644 --- a/NEXT_STEPS.md +++ b/NEXT_STEPS.md @@ -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 Jest + ts-jest är uppsatt. Tester finns för: diff --git a/TEKNISK_BESKRIVNING.md b/TEKNISK_BESKRIVNING.md index 1aabb96f..a5089288 100644 --- a/TEKNISK_BESKRIVNING.md +++ b/TEKNISK_BESKRIVNING.md @@ -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). + +--- \ No newline at end of file diff --git a/_archive/.copilot_move_recipe-document-converter.txt b/_archive/.copilot_move_recipe-document-converter.txt new file mode 100644 index 00000000..40a9e481 --- /dev/null +++ b/_archive/.copilot_move_recipe-document-converter.txt @@ -0,0 +1 @@ +Flytta manuellt mappen recipe-document-converter till _archive/recipe-document-converter. Verktyget kan inte flytta kataloger automatiskt i denna miljö. \ No newline at end of file diff --git a/add_to_seed.txt b/_archive/add_to_seed.txt similarity index 100% rename from add_to_seed.txt rename to _archive/add_to_seed.txt diff --git a/recipe-document-converter/package.json b/_archive/recipe-document-converter/package.json similarity index 100% rename from recipe-document-converter/package.json rename to _archive/recipe-document-converter/package.json diff --git a/recipe-document-converter/src/index.ts b/_archive/recipe-document-converter/src/index.ts similarity index 100% rename from recipe-document-converter/src/index.ts rename to _archive/recipe-document-converter/src/index.ts diff --git a/recipe-document-converter/src/parser.ts b/_archive/recipe-document-converter/src/parser.ts similarity index 100% rename from recipe-document-converter/src/parser.ts rename to _archive/recipe-document-converter/src/parser.ts diff --git a/recipe-document-converter/tsconfig.json b/_archive/recipe-document-converter/tsconfig.json similarity index 100% rename from recipe-document-converter/tsconfig.json rename to _archive/recipe-document-converter/tsconfig.json