# Nasta steg

Detta ar huvudroadmap for Recipe App.
All detaljhistorik och djup teknisk bakgrund finns i respektive tekniska dokument.

## Dokumentstatus (2026-05-03)

- Fokus: en gemensam prioriteringslista for produkt, utveckling och drift.
- Delplaner for underomraden ska referera hit, inte duplicera hela roadmapen.

## Nyligen klart

- Kvittoimport: förbättrad antal/förpackningsinferens och robustare regelmotor.
- Kategorisering: utökade brödregler + contradiction guards och nya regler för pasta, grädde, ägg, juice, godis, och potatis.
- Kategoriträd: nya noder `Korvbröd` under `Fastfoodbröd` och `Grädde` under `Matlagning` i seed-data.
- Flutter: klientpersistens för pågående kvittoimport.
- Produktmodell: user-scoped produkter och seed renodlad till kategorier.
- Testinfrastruktur: parametriserade enhetstester för kvittoimport (18 testfall).
- CI/CD: GitHub Actions-pipeline för automatiserad testkörning vid push och pull request.
- **Node.js versionsparitet:** `package-lock.json` spåras nu i git för båda repos; Dockerfiles kör `npm ci` — reproducerbara byggen i alla miljöer.
- **PDF-kvittoimport stabiliserad:** `pdf-parse` CJS-fix + `pdfjs-dist/legacy` fallback löser `DOMMatrix`-fel i Node.js.
- **Felkods-forwarding fixad:** `receipt-import.service.ts` i recipe-api vidarebefordrar nu 503 från importer-api som `ServiceUnavailableException` istället för att alltid returnera 400.
- **AI-optimering (PDF):** `looksLikeReceiptProductLine()` i importer-api filtrerar bort header/footer-rader — Mistral anropas enbart för rader som faktiskt kan vara produkter.
- **Receptparser hardening:** gemensam parserutility, intervall/parantes/brak-forbattringar samt testtackning for parsern.
- **Receptsakerhet och dataintegritet:** aktiv-produktvalidering, transaktion vid update, orphan-fil-cleanup och striktare owner-hantering av legacy-recept.
- **Alternativa ingredienser (Option A):** lagring i `alternativeProductIds` (JSON), matchning mot flera alternativ och lagerkoll som inkluderar alternativ.
- **Flutter felhantering:** kopierbara felmeddelanden i snackbar + global textselektion for enklare support/felsokning.

## Huvudprioriteringar

1. Aliasstrategi i kvittoimport: user-scope som standard, global fallback via admin.
3. Stabilisera bildimport och diagnostik i alla miljoer.
4. Lokalisera kvarvarande stora Flutter-vyer i import/inventarie.
5. Forbereda avancerad AI-integration med tydlig loggning/audit.
6. Pa borja EAN-stod via Open Food Facts.

## Beslut som styr arbetet

- User-scope for data som ar personligt agd.
- Backend-kontrakt ar sanningskalla; klienter foljer kontrakten.
- Importfunktionalitet ar delegerad till microservice-importer dar det ar beslutat.

## Framtida förbättringsområden

### Säkerhet: httpOnly cookies för Flutter Web

Idag lagras JWT-token i localStorage via SharedPreferences i Flutter Web. För att minska XSS-risk bör backend och Flutter Web stödja httpOnly-cookies för tokens. Detta kräver:
- Backend: endpoint för att sätta och läsa httpOnly-cookie vid login.
- Flutter Web: anpassning så att token inte läses från localStorage utan session hanteras via cookie.
Detta är en större arkitekturändring och endast relevant för webben.

### Säkerhet: Gitea webhook-signaturvalidering

Om Gitea-webhooks används, implementera endpoint i backend som validerar `X-Gitea-Signature` med timing-safe jämförelse. Lägg till `GITEA_WEBHOOK_SECRET` i .env.example. Se säkerhetshärdningsplanen för kodexempel.

### Alternativa ingredienser — migrering till relationsmodell (Option B)

Nuläge: `RecipeIngredient.alternativeProductIds` lagras som JSON-kolumn (Option A).
Detta fungerar men saknar referensintegritet — om en alternativ produkt tas bort uppdateras inte kolumnen automatiskt.

Framtida lösning: Ersätt JSON-kolumnen med en separat tabell:
```prisma
model RecipeIngredientAlternative {
	id                 Int              @id @default(autoincrement())
	recipeIngredientId Int
	recipeIngredient   RecipeIngredient @relation(fields: [recipeIngredientId], references: [id], onDelete: Cascade)
	productId          Int
	product            Product          @relation(fields: [productId], references: [id], onDelete: Cascade)
}
```
Fördelar: FK-integritet, möjlig sortering/prioritering av alternativ, lättare att querrya.
Förutsättning: migration som konverterar befintlig JSON-data till rader i tabellen.

## Relaterade dokument

- `README.md` - anvandarperspektiv.
- `TEKNISK_BESKRIVNING.md` - teknisk huvudreferens.
- `produktlansering.md` - releasechecklista.
- `migrering-MSI.md` - migreringshistorik for importer.
- `flutter/next_steps_flutter.md` - Flutter-specifik plan.
- `_archive/microservice-ai/AI-FUNKTIONER.md` - AI-strategi och historik.
