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;