- Fixed missing 'path' import in batchUpload.js - Fixed GroupRepository import (singleton vs class) - Added htpasswd file to development config - Created new nginx.conf based on working production config - Updated Dockerfile to copy htpasswd for development Status: ✅ Upload functionality restored (both single and batch) ✅ Backend routing and error handling fixed ⚠️ nginx auth config needs troubleshooting (container not using new config)
102 lines
3.6 KiB
JavaScript
102 lines
3.6 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 groupRepository = require('../repositories/GroupRepository');
|
|
const fs = require('fs');
|
|
|
|
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;
|
|
const groupName = req.body.groupName || 'Unnamed Group';
|
|
|
|
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();
|
|
});
|
|
});
|
|
|
|
// Get file stats
|
|
const fileStats = fs.statSync(savePath);
|
|
const fileSize = fileStats.size;
|
|
|
|
// 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);
|
|
});
|
|
|
|
// Create or update group in database
|
|
const groupId = generateId();
|
|
const currentYear = new Date().getFullYear();
|
|
const uploadDate = new Date().toISOString();
|
|
|
|
const groupData = {
|
|
groupId: groupId,
|
|
year: currentYear,
|
|
title: groupName,
|
|
description: `Einzelnes Bild Upload: ${file.name}`,
|
|
name: groupName,
|
|
uploadDate: uploadDate,
|
|
images: [{
|
|
fileName: fileName,
|
|
originalName: file.name,
|
|
filePath: `${endpoints.UPLOAD_STATIC_DIRECTORY}/${fileName}`,
|
|
uploadOrder: 1,
|
|
fileSize: fileSize,
|
|
mimeType: file.mimetype,
|
|
previewPath: `${endpoints.PREVIEW_STATIC_DIRECTORY}/${previewFileName}`
|
|
}]
|
|
};
|
|
|
|
// Save to database
|
|
await groupRepository.createGroup(groupData);
|
|
|
|
console.log(`✅ Group created: ${groupName} with image ${fileName}`);
|
|
|
|
// Return immediately with file path
|
|
res.json({
|
|
filePath: `${endpoints.UPLOAD_STATIC_DIRECTORY}/${fileName}`,
|
|
fileName: fileName,
|
|
groupId: groupId,
|
|
groupName: groupName
|
|
});
|
|
|
|
} catch(err) {
|
|
console.error('Upload error:', err);
|
|
return res.status(500).json({ error: err.message });
|
|
}
|
|
});
|
|
|
|
module.exports = router; |