fix(profil): update user ID retrieval and improve fetch request error handling

This commit is contained in:
Nils-Johan Gynther
2026-04-18 14:58:52 +02:00
parent a67f9cb2c1
commit 0598e027ac
2 changed files with 43 additions and 6 deletions
+33
View File
@@ -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
+10 -6
View File
@@ -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 <AnvandareClient users={users} currentUserId={userId ?? 0} />;
return <AnvandareClient users={users} currentUserId={userId} />;
}