Enhance README and TEKNISK_BESKRIVNING with detailed features, API endpoints, and Markdown import process for Recipe App

This commit is contained in:
Nils-Johan Gynther
2026-04-12 07:26:20 +02:00
parent 4ea55012bb
commit ea971c2f63
2 changed files with 635 additions and 233 deletions
+94 -11
View File
@@ -8,11 +8,26 @@ En fullstack-applikation för hantering av hemmavaror och recept. Håll koll på
## Funktioner
- **Hemmavaror** — lägg till, redigera och konsumera varor. Filtrera på plats och bäst före-datum.
- **Recept** — skapa och redigera recept med ingredienser och tillagningsinstruktioner (Markdown-stöd).
- **Receptjämförelse** — se direkt vilka ingredienser du har hemma och vad som saknas.
- **Importera recept från Markdown** — klistra in ett recept i ett enkelt textformat, granska matchade produkter och spara med ett klick.
- **Admin: Produkter** — hantera produktnamn och slå ihop dubbletter.
### Inventorie (Hemmavaror)
- **Lägg till, redigera och ta bort varor** — hantera produkt, kvantitet, enhet, plats, märke och bäst före-datum
- **Filtrera och sortera** — efter plats (kyl, frys, skafferi), bäst före-datum, och namn (A–Ö)
- **Konsumera varor** — registrera förbrukad mängd med eventuell kommentar
- **Konsumtionshistorik** — spåra vad som använts när och i vilken mängd
- **Utförlig information** — stöd för varumärke, lagringsnot, tillkomsttid, mera detaljer
### Recept
- **Skapa och redigera recept** — med ingredienser, kvantiteter, enheter och instruktioner (Markdown-stöd)
- **Receptjämförelse mot inventorie** — se direkt vilka ingredienser du har hemma, vad som saknas och enhetskonflikt
- **Importera recept från Markdown** — klistra in ett recept i enkelt format, låt systemet matcha ingredienser, granska och spara med ett klick
- **Intelligenta matchningar** — Levenshtein-baserad likhetsbedömning hittar rätt produkt även på osäker stavning
- **Enhetskonvertering** — automatisk konvertering mellan viktenheter (g/kg), volymenheter (ml/dl) och portionsenheter (tsk/msk)
### Admin: Produkter
- **Hantera produktnamn** — uppdatera canonical name för varje produkt (användes vid receptmatchning)
- **Hitta dubbletter** — identifiera produkter med samma normaliserade namn
- **Slå ihop produkter** — merge två produktposter, flytta alla inventarieföremål till målprodukten (källan soft-deleteras)
- **Förhandsvisning** — granska vad som kommer att hända innan merge genomförs
- **Återställ produkter** — restore tidigare raderade produkter
---
@@ -21,28 +36,54 @@ En fullstack-applikation för hantering av hemmavaror och recept. Håll koll på
### Förutsättningar
- Docker och Docker Compose
- En `proxy`-nätverk i Docker (extern, hanteras av Caddy eller liknande)
- En extern `proxy`-nätverk i Docker för Caddy (rekommenderat) eller localhost-konfiguration
### Starta applikationen
```bash
# Bygg och starta alla tjänster
# Bygg alla images (första gånger)
docker compose build
# Starta alla tjänster i bakgrunden
docker compose up -d
```
### Bygg om enbart backend (t.ex. efter kodändringar)
Frontend är tillgänglig på `http://localhost:3000` (eller via Caddy proxy)
Backend API är tillgänglig på `http://localhost:8080` (eller via Caddy proxy)
### Bygg bara backend eller frontend om behövligt
```bash
# Bygg enbart backend (t.ex. efter kodändringar)
docker compose build recipe-api
# Starta bara backend (övriga tjänster fortsätter)
docker compose up -d recipe-api
# Liknande för frontend
docker compose build recipe-frontend
docker compose up -d recipe-frontend
```
### Kontrollera hälsa
```bash
# Hälsokontroll via HTTP (backend måste köra)
curl http://localhost:8080/health
# Databasspecifik hälsokontroll
curl http://localhost:8080/health/db
```
---
## Importera recept från Markdown
Gå till **Recept → Lägg till nytt recept → Importera från Markdown** och klistra in ett recept i följande format:
### Steg 1: Gå till receptsidan
Navigera till **Recept** och välj **Lägg till nytt recept → Importera från Markdown**
### Steg 2: Klistra in receptet
Använd följande format:
```markdown
# Köttfärssås
@@ -54,12 +95,54 @@ En klassisk köttfärssås med massa smak.
- 1 st lök
- 2 msk tomatpuré
- 1 dl grädde (vispgrädde)
- salt och peppar
## Tillvägagångssätt
Hacka löken och stek den mjuk i lite olja. Tillsätt köttfärsen...
Hacka löken och stek den mjuk i lite olja. Tillsätt köttfärsen och bräsera tills den är genomstekt. Tillsätt tomatpuré och låt det småkoka ett par minuter innan du tillsätter grädde. Smaka av med salt och peppar.
```
Systemet tolkar texten, föreslår matchande produkter från databasen och låter dig granska och justera innan receptet sparas.
### Steg 3: Granska
Systemet:
- Tolkar receptnamn, beskrivning och instruktioner
- Försöker matcha varje ingrediens mot databasen (Levenshtein-likhet)
- Visar förslag för varje ingrediens i prioriteringsordning
Du kan:
- Redigera nombres, beskrivning och instruktioner
- Välj rätt produkt från förslagen för varje ingrediens
- Ta bort ingredienser som inte behövs
- Ändra kvantiteter och enheter
### Steg 4: Spara
Klicka "Spara recept" — basrecepet sparas med dina valida ingredienser
### Receptformat — regler
| Sektion | Beskrivning |
|---------|------------|
| **H1 (# titel)** | Receptnamn |
| **Text efter H1, före ## Ingredienser** | Receptbeskrivning (valfritt) |
| **## Ingredienser** | Rubrik för ingredienslistan |
| **Ingrediensrader** | Mönster: `- ANTAL ENHET NAMN` eller `- ANTAL NAMN` (standard: st) |
| **Parentes i ingrediens** | Text i `(parentes)` sparas som ingrediensnot, t.ex. `(vispgrädde)`, `(eller crème fraiche)` |
| **## Tillvägagångssätt** (eller `## Instruktioner`) | Rubrik för tillagningsinstruktioner |
| **Text under instruktioner** | Instruktionstexten (kan fortsätta över flera rader) |
### Matchningsalgoritm
Systemet använder tre metoder för att hitta rätt produkt:
1. **Exakt match** (100 poäng)
- Ingrediensnamn matchar exakt efter normalisering (lowercase, utan skiljetecken)
2. **Delsträng-match** (70 poäng)
- Ingrediensnamn förekommer som del av produktnamnet eller vice versa
3. **Levenshtein-likhet** (40100 poäng)
- Likhetspoäng baserat på tecknenskillnad
- Mindre än 40 poäng filtreras bort
Systemet visar upp till 5 bästa förslag per ingrediens.
---