Files
erp-nutzfahrzeuge/.a0/worklog.md
T

2.0 KiB

Worklog

T05: Dateiablage pro Fahrzeug + File UI - 2026-07-17

Files Created

Backend:

  • backend/app/models/file.py - File SQLAlchemy model (UUID, vehicle_id FK, filename, path, mime_type, size, thumbnail_path)
  • backend/app/schemas/file.py - Pydantic schemas (FileUploadResponse, FileResponse, FileListResponse, FileDeleteResponse)
  • backend/app/services/file_service.py - File service (upload, get, list, delete, validate_mime_type, validate_file_size)
  • backend/app/utils/thumbnails.py - Thumbnail generation (200x200) using Pillow for jpg/png/webp
  • backend/app/routers/files.py - Files router (GET list, POST upload, GET download, DELETE)
  • backend/tests/test_files.py - 43 tests covering all endpoints, validation, thumbnails, service unit tests

Frontend:

  • frontend/lib/files.ts - API functions, types, utilities (listFiles, uploadFile, deleteFile, formatFileSize, isImageMime)
  • frontend/components/files/FileUpload.tsx - Drag-and-drop multi-file upload with validation
  • frontend/components/files/FileList.tsx - File list with thumbnails, download, delete confirm dialog
  • frontend/components/files/FileGallery.tsx - Gallery view filtering images only
  • frontend/components/files/FilePreview.tsx - File preview modal with metadata and download
  • frontend/tests/files.test.tsx - 25 tests covering all components and utilities

Files Modified

  • backend/app/models/vehicle.py - Added files relationship to Vehicle model
  • backend/app/main.py - Registered files router
  • backend/requirements.txt - Added Pillow>=10.0.0

Test Results

  • Backend: 43/43 passed, 82% coverage (file_service 95%, thumbnails 88%, files router 55%)
  • Frontend: 25/25 passed
  • TypeScript: tsc --noEmit passes with no errors

Smoke Test

  • Backend API endpoints fully functional with real PostgreSQL (upload, list, download, delete)
  • Thumbnail generation verified for JPEG, PNG, WebP (200x200)
  • MIME validation enforces jpg/png/webp/pdf/doc/docx only
  • File size limit enforced at 20MB
  • Frontend drag-and-drop upload works, delete confirmation dialog works, gallery filters images