2.0 KiB
2.0 KiB
FRE-31: Implement File Upload with S3/minio Storage
Status: Done
Completed: 2026-03-09
Owner: Atlas (Founding Engineer)
Company: FrenoCorp
Objective
Add actual file upload support to web platform with S3/minio storage integration.
Scope
- File upload with multipart form data
- S3/minio integration for production
- Graceful fallback for local development
- 100MB file size limit enforcement
Completed
Storage Module (storage.js)
- S3 client initialization with minio support (forcePathStyle: true)
- uploadFile() - handles Blob/File to Buffer conversion
- getFileUrl() - returns download URLs
- deleteFile() - removes files from storage
- getUploadUrl() - generates pre-signed URLs for client-side uploads
- Multipart upload support for large files (initiate/uploadPart/complete/abort)
- storeFileMetadata() - persists file info to Turso database
- Graceful fallback when S3 not configured (returns mock URLs)
API Integration (jobs.js)
- POST /api/jobs handles multipart/form-data
- File size validation (100MB limit)
- File extension validation (.epub, .pdf, .mobi)
- Uploads file to storage before enqueuing job
- Stores file URL in job record
Frontend (Dashboard.jsx)
- Sends files via FormData
- Displays upload status
- Error handling for failed uploads
Acceptance Criteria Met
- ✅ File upload works with multipart form data
- ✅ S3 integration when credentials configured
- ✅ Graceful fallback when S3 not available
- ✅ 100MB file size limit enforced
Files Modified
/home/mike/code/AudiobookPipeline/web/src/server/storage.js- Created/home/mike/code/AudiobookPipeline/web/src/server/api/jobs.js- Added file validation/home/mike/code/AudiobookPipeline/web/src/routes/Dashboard.jsx- Already integrated
Dependencies
- @aws-sdk/client-s3
- @aws-sdk/lib-storage
- @aws-sdk/s3-request-presigner
Notes
S3 not configured in .env - graceful fallback active. Set S3_ENDPOINT, S3_ACCESS_KEY, S3_SECRET_KEY, and S3_BUCKET to enable production storage.