From dba3c63ec481cb3077445ba469a90d9384997a65 Mon Sep 17 00:00:00 2001 From: Nils-Johan Gynther Date: Mon, 4 May 2026 22:29:29 +0200 Subject: [PATCH] feat: enhance recipe creation process; add editable fields for ingredients and support for alternative ingredients in review step --- NEXT_STEPS.md | 4 ++++ TEKNISK_BESKRIVNING.md | 25 +++++++++++++++++++++++++ flutter/teknisk_beskrivning_flutter.md | 5 +++++ 3 files changed, 34 insertions(+) diff --git a/NEXT_STEPS.md b/NEXT_STEPS.md index 58103f68..502074f8 100644 --- a/NEXT_STEPS.md +++ b/NEXT_STEPS.md @@ -21,6 +21,10 @@ All detaljhistorik och djup teknisk bakgrund finns i respektive tekniska dokumen - **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 diff --git a/TEKNISK_BESKRIVNING.md b/TEKNISK_BESKRIVNING.md index 31fe5a03..2454c105 100644 --- a/TEKNISK_BESKRIVNING.md +++ b/TEKNISK_BESKRIVNING.md @@ -97,6 +97,31 @@ Funktionen i `receipt-import.service.ts` matchar kvittonamn mot nyckelord och re --- +## Nyheter och forbattringar (2026-05-04) + +- **Receptimport parser centraliserad:** parsinglogik for markdownrecept ar flyttad till en gemensam utility i backend (`src/common/utils/recipe-parser.ts`) och duplicerad parserkod i recipes-service ar borttagen. +- **Parser prestanda/robusthet:** regex och enhetslista ar lyfta till modulniva, braktal och intervall (ex. `ca 600-700 g`) hanteras konsekvent, och ingrediensnamn med `eller` delas upp i alternativ. +- **Alternativa ingredienser (Option A i drift):** `RecipeIngredient` har nu `alternativeProductIds` (JSON) for att lagra alternativa produktval per ingrediensrad. +- **Validering vid create/update av recept:** backend validerar att valda produkter ar aktiva innan recept sparas. +- **Atomar uppdatering av ingredienser:** `update()` for recept kor nu inom Prisma-transaction (delete + create/update i samma transaktion). +- **Sakrare felhantering vid bildimport:** om receptskapande fallerar efter nedladdning av bild stadas orphan-filer bort. +- **Ownerless recept hardening:** legacy-recept utan owner claimas av forsta redigerande anvandare; recept med annan owner fortsatter att vara blockerade for obehoriga. +- **Inventory preview med alternativ:** lagerkoll kan rakna in alternativa produkter nar primar produkt saknas. +- **Testning:** nya enhetstester for recipe-parser lagda; total testsvit verifierad gron (57 tester). + +### Prisma migration driftlarning (2026-05-04) + +Vid deploy av migrationen `20260504220420_add_alternative_product_ids` uppstod ett produktionsstopp med Prisma P3009/P3018. Rotorsaker var en tidigare failed migration samt ogiltig SQL-korning i miljo. + +Praktisk recovery-sekvens som verifierades: +1. Kor `prisma migrate resolve --rolled-back ` i samma runtime-miljo som appen (containern), inte i ett shell utan korrekt DB-konfiguration. +2. Verifiera `DATABASE_URL` i runtime (container) innan ny deploy. +3. Kor `prisma migrate deploy` igen. +4. Om schema redan ar uppdaterat men migrationshistorik halkat efter: markera migrationen som `--applied` och deploya pa nytt. + +Driftrekommendation: +- Kor migrationskommandon via app-containern i compose-stacken for att undvika skillnader i Prisma-version, env-laddning och DNS/hostnamn. + ## Nyheter och förbättringar (2026-04-30) - **Microservice-importer integrerad** — `importer-api` körs nu som intern Docker-tjänst i `recipe-app/compose.yml`. All URL-skrapning, OCR, PDF-parsning och AI-kvittoparsning delegeras dit. `recipe-api` behåller Levenshtein-matchning, produktdatabas och AI-kategorisering. Se [migrering-MSI.md](migrering-MSI.md) för fullständig lista över ändrade filer. diff --git a/flutter/teknisk_beskrivning_flutter.md b/flutter/teknisk_beskrivning_flutter.md index d605bdf7..eae12e30 100644 --- a/flutter/teknisk_beskrivning_flutter.md +++ b/flutter/teknisk_beskrivning_flutter.md @@ -20,6 +20,10 @@ Bygg och drift sker pa Linux/Ubuntu i containeriserad miljo. - Forbattrad inferens for antal/forpackning (inklusive uttryck som `2st`). - Tydlig separation i UI mellan AI-kategoriforslag och produktforslag. - Ingen server-side persistens introducerad for kvittosession. +- Receptskapande: review-steg med redigerbara falt for quantity/unit/note per ingrediens. +- Receptskapande: tydlig varning i UI nar ingen produktmatchning hittas for inkluderad ingrediens. +- Receptskapande: stod for alternativa ingredienser i parse-svar (ex. "ris eller couscous") och visning i granskningsvyn. +- Global kopierbar feltext: copybar error-snackbar + SelectionArea pa appniva for battre felsokning/stod. ## Arkitektur @@ -70,6 +74,7 @@ docker compose -f compose.yml -f compose.flutter.yml up -d --no-deps recipe-flut - PDF-mime kan komma som `application/octet-stream` i Flutter Web. - Orphan-varning ar normal nar huvudstack och Flutter-stack kors separat. - Cache/service worker kan visa gammal frontend efter deploy. +- Vid massersattningar i Dart: verifiera parentesbalans i `showSnackBar(...)`-anrop innan build, annars faller web-kompilering med syntaxfel. ## Relaterade dokument