diff --git a/NEXT_STEPS.md b/NEXT_STEPS.md index f7737cc2..b0fc1b74 100644 --- a/NEXT_STEPS.md +++ b/NEXT_STEPS.md @@ -37,6 +37,7 @@ | Teknisk skuld — oanvända InventoryItem-fält | ✅ Klart (migration 20260418) | | Teknisk skuld — redirect-routes städade | ✅ Klart | | Avancerad AI-integration (veckoplanering, kampanjdata) | ❌ Planerad | +| EAN-skanning via Open Food Facts API | ❌ Planerad | --- @@ -130,3 +131,35 @@ Jest + ts-jest är uppsatt. Tester finns för: - `recipes.service.ts` (`normalizeUnit`, `convertUnit`) — 17 tester Kör med `npm test` i `backend/`. + +--- + +## Planerade funktioner + +### EAN-skanning — import via streckkod (Open Food Facts) +**Mål:** Låt användaren skanna eller skriva in en EAN-streckkod och få produktinformation (namn, kategori, näringsvärden) ifyllt automatiskt. + +Open Food Facts är ett öppet, gratis API utan API-nyckel för grundläggande användning. + +**Exempelanrop (EAN 7310960010016):** +``` +GET https://world.openfoodfacts.org/api/v0/product/{ean}.json +``` +Svaret innehåller: +- `product.product_name` — produktnamn +- `product.categories` — kategoristräng (kommaseparerad) +- `product.nutriments` — näringsvärden (energi, protein, fett, kolhydrater, m.fl.) +- `product.code` — EAN-koden bekräftad + +**Förslag på implementation:** + +1. **Backend-endpoint** — `GET /api/products/ean/:code` — slår upp i Open Food Facts, returnerar normaliserat produktförslag (namn, kategori, näringsvärden) utan att spara +2. **Frontend-import** — nytt fält i produktformuläret (eller separat import-flöde): ange EAN → knapp "Hämta" → formuläret förifylls +3. **Alternativt:** kamerabaserad skanning i mobil webbläsare via `BarcodeDetector` API (eller externt bibliotek som `zxing-js`) +4. **Kategorimappning** — Open Food Facts-kategorier är på engelska/franska; en mappningstabell eller fuzzy-matchning mot systemets kategorier behövs +5. **Näringsdata** — om `product.nutriments` finns kan det sparas direkt i Prisma-modellens näringsvärdesfält (redan schema-klara) + +**Begränsningar att ha i åtanke:** +- Produkttäckning varierar — svenska dagligvaror är välrepresenterade men inte allt finns +- Produktnamn är ofta på originalspråk; kan behöva redigeras +- Rate limiting: för hög användning rekommenderar Open Food Facts att kontakta dem diff --git a/frontend/app/profil/tabs/AnvandareTab.tsx b/frontend/app/profil/tabs/AnvandareTab.tsx index 5df96dc9..c997fd02 100644 --- a/frontend/app/profil/tabs/AnvandareTab.tsx +++ b/frontend/app/profil/tabs/AnvandareTab.tsx @@ -1,19 +1,23 @@ import { auth } from '../../../auth'; +import { getAuthHeaders } from '../../../lib/auth-headers'; import AnvandareClient from './AnvandareClient'; export default async function AnvandareTab() { const session = await auth(); - const userId = (session?.user as any)?.userId as number | undefined; + const userId = Number(session?.user?.id ?? 0); + const headers = await getAuthHeaders(); const res = await fetch( `${process.env.NEXT_PUBLIC_API_URL_INTERNAL ?? 'http://recipe-api:8080'}/api/users`, - { - headers: { Authorization: `Bearer ${(session as any)?.accessToken}` }, - cache: 'no-store', - }, + { headers, cache: 'no-store' }, ); + if (!res.ok) { + const text = await res.text().catch(() => ''); + console.error(`[AnvandareTab] GET /api/users misslyckades: ${res.status}`, text); + } + const users = res.ok ? await res.json() : []; - return ; + return ; }