const multer = require('multer'); const path = require('path'); const fs = require('fs'); const { v4: uuidv4 } = require('uuid'); // Create uploads directory if it doesn't exist const uploadDir = process.env.UPLOAD_DIR || './uploads'; const documentsDir = path.join(uploadDir, 'documents'); const profilesDir = path.join(uploadDir, 'profiles'); const tempDir = path.join(uploadDir, 'temp'); [uploadDir, documentsDir, profilesDir, tempDir].forEach(dir => { if (!fs.existsSync(dir)) { fs.mkdirSync(dir, { recursive: true }); } }); // Storage configuration const storage = multer.diskStorage({ destination: (req, file, cb) => { let folder = documentsDir; if (req.body.uploadType === 'profile') { folder = profilesDir; } else if (req.body.uploadType === 'temp') { folder = tempDir; } cb(null, folder); }, filename: (req, file, cb) => { const uniqueId = uuidv4(); const ext = path.extname(file.originalname); const filename = `${uniqueId}${ext}`; cb(null, filename); } }); // File filter const fileFilter = (req, file, cb) => { // Allowed file types const allowedTypes = [ 'application/pdf', 'image/jpeg', 'image/jpg', 'image/png', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ]; if (allowedTypes.includes(file.mimetype)) { cb(null, true); } else { cb(new Error('Invalid file type. Only PDF, JPG, PNG, DOC, DOCX, XLS, XLSX allowed'), false); } }; // Multer upload configuration const upload = multer({ storage: storage, limits: { fileSize: parseInt(process.env.MAX_FILE_SIZE) || 10 * 1024 * 1024 // 10MB default }, fileFilter: fileFilter }); // Single file upload const uploadSingle = upload.single('file'); // Multiple files upload const uploadMultiple = upload.array('files', 10); // Max 10 files // Error handler for multer const handleUploadError = (err, req, res, next) => { if (err instanceof multer.MulterError) { if (err.code === 'LIMIT_FILE_SIZE') { return res.status(400).json({ success: false, message: 'File too large. Maximum size is 10MB' }); } return res.status(400).json({ success: false, message: `Upload error: ${err.message}` }); } else if (err) { return res.status(400).json({ success: false, message: err.message }); } next(); }; module.exports = { uploadSingle, uploadMultiple, handleUploadError };