Files
recipe-app/NEXT_STEPS.md
T
2026-05-09 23:20:52 +02:00

6.1 KiB

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.
  • Kvittoimport — Simplified Matching Logic (2026-05-09): Unified matcher som konsoliderar product matching + categorization i en explicit flödestre. Eliminar split mellan matchProducts() och enrichWithAiCategories(). Ger tydligare trace-logging och bättre debuggability för varför ett item matchades på ett visst sätt. Systemet är nu mer underhållsbart och framtida förbättringar på matching/kategorisering går snabbare.

Huvudprioriteringar

  1. Aliasstrategi i kvittoimport: user-scope som standard, global fallback via admin.
  2. [CLEANUP] Receipt import legacy code (2026-05-09): KLART
    • Borttaget: matchProducts(), enrichWithAiCategories(), findWordMatch() (gammal), m.fl.
    • Tester uppdaterade och gröna (66/66)
    • Se SESSION_2026-05-09_RECEIPT_IMPORT.md för detaljer
  3. [FEATURE] Product Management & Scroll Fix (2026-05-09): KLART
    • Scroll-issue i kvittoimport fixat (7 rader nu synliga)
    • Admin rename/merge endpoints implementerade
    • Private rename/merge endpoints för users implementerade
    • Kodduplicering i products.service.ts eliminerad (~80 rader)
    • admin_products_panel optimerad (cache, parallell restore, expression switches)
    • Deploy-script förbättrad med selektiv build och seed-kontroll
    • Se SESSION_2026-05-09_RECEIPT_IMPORT.md för detaljer
    • Todo: Deploy till prod, testa i live miljö, ev. add UI för user private rename/merge
  4. Stabilisera bildimport och diagnostik i alla miljöer.
  5. Lokalisera kvarvarande stora Flutter-vyer i import/inventarie.
  6. Förbereda avancerad AI-integration med tydlig loggning/audit.
  7. Påbörja EAN-stöd 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:

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.