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)
65 lines
2.3 KiB
JavaScript
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; |