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 ;
}