fix(profil): update user ID retrieval and improve fetch request error handling
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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} />;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user