Project-Image-Uploader/backend/src/routes/upload.js
matthias.lotz 661d6441ab feat: integrate preview generation into upload flow
Task 4: Upload Routes Extended
- upload.js: Generate preview after single file upload
- batchUpload.js: Generate previews for all batch uploads
- Async preview generation (non-blocking response)
- Auto-update preview_path in database after generation

Task 5: Repository with preview_path
- GroupRepository: Include preview_path in INSERT
- getGroupById: Return previewPath in image objects
- groupFormatter: Add previewPath to formatGroupDetail()
- All queries now support preview_path column

Task 6: API Endpoints Extended
- Add PREVIEW_STATIC_DIRECTORY constant (/previews)
- Serve preview images via express.static
- All existing endpoints now return previewPath field
- Fallback to filePath if preview not available (frontend)
2025-10-30 20:41:06 +01:00

65 lines
2.3 KiB
JavaScript

const generateId = require("shortid");
const express = require('express');
const { Router } = require('express');
const { endpoints, UPLOAD_FS_DIR, PREVIEW_FS_DIR } = require('../constants');
const path = require('path');
const ImagePreviewService = require('../services/ImagePreviewService');
const router = Router();
// Serve uploaded images via URL /upload but store files under data/images
router.use(endpoints.UPLOAD_STATIC_DIRECTORY, express.static( path.join(__dirname, '..', UPLOAD_FS_DIR) ));
// Serve preview images via URL /previews but store files under data/previews
router.use(endpoints.PREVIEW_STATIC_DIRECTORY, express.static( path.join(__dirname, '..', PREVIEW_FS_DIR) ));
router.post(endpoints.UPLOAD_FILE, async (req, res) => {
if(req.files === null){
console.log('No file uploaded');
return res.status(400).json({ msg: 'No file uploaded' });
}
const file = req.files.file;
fileEnding = file.name.split(".")
fileEnding = fileEnding[fileEnding.length - 1]
fileName = generateId() + '.' + fileEnding
const savePath = path.join(__dirname, '..', UPLOAD_FS_DIR, fileName);
try {
// Save the uploaded file
await new Promise((resolve, reject) => {
file.mv(savePath, err => {
if(err) reject(err);
else resolve();
});
});
// Generate preview asynchronously (don't wait for it)
const previewFileName = ImagePreviewService._getPreviewFileName(fileName);
const previewPath = ImagePreviewService.getPreviewPath(previewFileName);
ImagePreviewService.generatePreview(savePath, previewPath)
.then(result => {
if (!result.success) {
console.warn(`Preview generation failed for ${fileName}:`, result.error);
}
})
.catch(err => {
console.error(`Unexpected error during preview generation for ${fileName}:`, err);
});
// Return immediately with file path
res.json({
filePath: `${endpoints.UPLOAD_STATIC_DIRECTORY}/${fileName}`,
fileName: fileName
});
} catch(err) {
console.error(err);
return res.status(500).send(err);
}
});
module.exports = router;