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 — oanvända InventoryItem-fält | ✅ Klart (migration 20260418) |
|
||||||
| Teknisk skuld — redirect-routes städade | ✅ Klart |
|
| Teknisk skuld — redirect-routes städade | ✅ Klart |
|
||||||
| Avancerad AI-integration (veckoplanering, kampanjdata) | ❌ Planerad |
|
| 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
|
- `recipes.service.ts` (`normalizeUnit`, `convertUnit`) — 17 tester
|
||||||
|
|
||||||
Kör med `npm test` i `backend/`.
|
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 { auth } from '../../../auth';
|
||||||
|
import { getAuthHeaders } from '../../../lib/auth-headers';
|
||||||
import AnvandareClient from './AnvandareClient';
|
import AnvandareClient from './AnvandareClient';
|
||||||
|
|
||||||
export default async function AnvandareTab() {
|
export default async function AnvandareTab() {
|
||||||
const session = await auth();
|
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(
|
const res = await fetch(
|
||||||
`${process.env.NEXT_PUBLIC_API_URL_INTERNAL ?? 'http://recipe-api:8080'}/api/users`,
|
`${process.env.NEXT_PUBLIC_API_URL_INTERNAL ?? 'http://recipe-api:8080'}/api/users`,
|
||||||
{
|
{ headers, cache: 'no-store' },
|
||||||
headers: { Authorization: `Bearer ${(session as any)?.accessToken}` },
|
|
||||||
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() : [];
|
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