Project-Image-Uploader/backend/src/routes/upload.js
matthias.lotz 3845de92a6 Fix batch upload and attempt nginx auth setup
- 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)
2025-11-06 18:28:32 +01:00

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;