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:
@@ -1,5 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
Controller,
|
Controller,
|
||||||
|
HttpCode,
|
||||||
Post,
|
Post,
|
||||||
Request,
|
Request,
|
||||||
UploadedFile,
|
UploadedFile,
|
||||||
@@ -19,12 +20,14 @@ const ALLOWED_MIMES = [
|
|||||||
'image/heic',
|
'image/heic',
|
||||||
'image/heif',
|
'image/heif',
|
||||||
'application/pdf',
|
'application/pdf',
|
||||||
|
'application/octet-stream', // Flutter Web skickar detta för PDF-filer
|
||||||
];
|
];
|
||||||
|
|
||||||
@Controller('receipt-import')
|
@Controller('receipt-import')
|
||||||
export class ReceiptImportController {
|
export class ReceiptImportController {
|
||||||
constructor(private readonly receiptImportService: ReceiptImportService) {}
|
constructor(private readonly receiptImportService: ReceiptImportService) {}
|
||||||
|
|
||||||
|
@HttpCode(200)
|
||||||
@Post()
|
@Post()
|
||||||
@Throttle({ default: { ttl: 60_000, limit: 20 } })
|
@Throttle({ default: { ttl: 60_000, limit: 20 } })
|
||||||
@UseInterceptors(
|
@UseInterceptors(
|
||||||
|
|||||||
@@ -32,12 +32,12 @@ Relaterade dokument:
|
|||||||
## Arbetsplan
|
## Arbetsplan
|
||||||
|
|
||||||
### Pågående arbete
|
### 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.
|
- **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.
|
- **Adminfunktioner:** Avancerad AI-integration och ytterligare adminfunktioner planeras men är ej migrerade.
|
||||||
|
|
||||||
### Prioriterade nästa steg
|
### 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.
|
2. Säkerställa robust bildimport och diagnostik.
|
||||||
3. Implementera avancerad AI-integration för produktkategorisering.
|
3. Implementera avancerad AI-integration för produktkategorisering.
|
||||||
4. Utöka adminfunktioner för användarhantering och produktadministration.
|
4. Utöka adminfunktioner för användarhantering och produktadministration.
|
||||||
|
|||||||
@@ -44,8 +44,27 @@ Viktigt att komma ihåg vid implementering av nya funktioner och kodning är att
|
|||||||
### Auth
|
### Auth
|
||||||
- Login endpoint: `POST /api/auth/login`.
|
- 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
|
## Ö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.
|
- **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.
|
- **Adminfunktioner:** Avancerad AI-integration och ytterligare adminfunktioner planeras men är ej migrerade.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user