feat: allow application/octet-stream MIME type for PDF uploads in receipt import

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
Nils-Johan Gynther
2026-04-30 13:04:23 +02:00
parent d7881c6cf7
commit 57fe168543
3 changed files with 25 additions and 3 deletions
@@ -1,5 +1,6 @@
import {
Controller,
HttpCode,
Post,
Request,
UploadedFile,
@@ -19,12 +20,14 @@ const ALLOWED_MIMES = [
'image/heic',
'image/heif',
'application/pdf',
'application/octet-stream', // Flutter Web skickar detta för PDF-filer
];
@Controller('receipt-import')
export class ReceiptImportController {
constructor(private readonly receiptImportService: ReceiptImportService) {}
@HttpCode(200)
@Post()
@Throttle({ default: { ttl: 60_000, limit: 20 } })
@UseInterceptors(
+2 -2
View File
@@ -32,12 +32,12 @@ Relaterade dokument:
## Arbetsplan
### Pågående arbete
- **Kvittoimport (Fas 6b):** Påbörjad men granskningssteg och bulk-spara återstår.
- **Kvittoimport (Fas 6b):** Grundflödet fungerar (2026-04-30) — PDF laddas upp, Mistral AI tolkar kvittot och returnerar strukturerade poster. Återstår: granskningssteg i UI och bulk-spara till pantry/inventarie.
- **Bildimport:** Säkerställa att containrar är uppdaterade med senaste kod och att diagnostikloggar syns vid felsökning.
- **Adminfunktioner:** Avancerad AI-integration och ytterligare adminfunktioner planeras men är ej migrerade.
### Prioriterade nästa steg
1. Slutför kvittoimport och bulk-spara.
1. Slutför kvittoimport: granskningssteg + bulk-spara.
2. Säkerställa robust bildimport och diagnostik.
3. Implementera avancerad AI-integration för produktkategorisering.
4. Utöka adminfunktioner för användarhantering och produktadministration.
+20 -1
View File
@@ -44,8 +44,27 @@ Viktigt att komma ihåg vid implementering av nya funktioner och kodning är att
### Auth
- Login endpoint: `POST /api/auth/login`.
## Kända fallgropar och API-gotchas
### Flutter Web och PDF MIME-typ
- Flutter Web skickar PDF-filer med MIME-typ `application/octet-stream` istället för `application/pdf`.
- Backend (`receipt-import.controller.ts`) måste tillåta båda: `application/pdf` och `application/octet-stream` i `ALLOWED_MIMES`.
- Symptom om detta saknas: HTTP 400 "Otillåten filtyp. Använd JPEG, PNG, WebP eller PDF."
### NestJS @Post() returnerar HTTP 201 som standard
- NestJS returnerar 201 (Created) för alla `@Post()`-endpoints som standard.
- Flutter-klienten (`ImportRepository`) accepterar nu alla 2xx-svar (`statusCode < 200 || statusCode >= 300`).
- Alternativt: lägg till `@HttpCode(200)` på backend-controllern för att returnera 200.
- Detta gjordes i `receipt-import.controller.ts` (2026-04-30).
### Kvittoimport — backend och arkitektur
- `/receipt-import` hanteras av en **dedikerad** `ReceiptImportController` och `ReceiptImportService`, **inte** av `QuickImportController`.
- `ReceiptImportService` använder **Mistral AI** för att parsa kvitton till strukturerade `ParsedReceiptItem[]` direkt — inget markdown.
- Svaret från `/receipt-import` är en array av `ParsedReceiptItem`, inte `{ markdown: "..." }`.
- `{ markdown: "..." }` är svaret från `/quick-import` (receptimport) — inte kvittoimport.
## Övrigt
- **Kvittoimport (Fas 6b):** Påbörjad men granskningssteg och bulk-spara återstår.
- **Kvittoimport (Fas 6b):** Grundflödet fungerar. Återstår: granskningssteg i UI och bulk-spara till pantry/inventarie.
- **Bildimport:** Säkerställa att containrar är uppdaterade med senaste kod och att diagnostikloggar syns vid felsökning.
- **Adminfunktioner:** Avancerad AI-integration och ytterligare adminfunktioner planeras men är ej migrerade.