97 lines
2.2 KiB
JavaScript
97 lines
2.2 KiB
JavaScript
const multer = require('multer');
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
|
|
const baseUploadDir = process.env.NODE_ENV === 'production'
|
|
? '/tmp/uploads'
|
|
: path.join(__dirname, '../../../uploads');
|
|
|
|
const taskUploadDir = path.join(baseUploadDir, 'task-submissions');
|
|
|
|
if (!fs.existsSync(taskUploadDir)) {
|
|
fs.mkdirSync(taskUploadDir, { recursive: true });
|
|
}
|
|
|
|
const storage = multer.diskStorage({
|
|
destination: (_req, _file, cb) => cb(null, taskUploadDir),
|
|
filename: (_req, file, cb) => {
|
|
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
|
|
cb(null, uniqueSuffix + path.extname(file.originalname));
|
|
},
|
|
});
|
|
|
|
const allowedMimeTypes = [
|
|
'application/pdf',
|
|
// 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
// 'application/zip',
|
|
// 'application/x-zip-compressed',
|
|
];
|
|
|
|
const fileFilter = (req, file, cb) => {
|
|
if (allowedMimeTypes.includes(file.mimetype)) {
|
|
cb(null, true);
|
|
return;
|
|
}
|
|
|
|
// const errMsg = 'Only PDF, DOCX, or ZIP files are allowed';
|
|
const errMsg = 'Only PDF files are allowed';
|
|
req.fileValidationError = errMsg;
|
|
cb(new Error(errMsg), false);
|
|
};
|
|
|
|
const taskUpload = multer({
|
|
storage,
|
|
fileFilter,
|
|
limits: {
|
|
fileSize: 5 * 1024 * 1024, //5MB
|
|
},
|
|
});
|
|
|
|
const taskUploadErrorHandler = (err, _req, res, next) => {
|
|
if (err instanceof multer.MulterError) {
|
|
if (err.code === 'LIMIT_FILE_SIZE') {
|
|
return res.status(413).json({
|
|
status: false,
|
|
data: null,
|
|
message: 'File size is too large. Maximum size is 5MB',
|
|
code: 413,
|
|
});
|
|
}
|
|
|
|
if (err.code === 'LIMIT_UNEXPECTED_FILE') {
|
|
return res.status(400).json({
|
|
status: false,
|
|
data: null,
|
|
message: {
|
|
[err.field]: `Field '${err.field}' exceeds the allowed file count or is not allowed.`,
|
|
},
|
|
code: 400,
|
|
});
|
|
}
|
|
|
|
return res.status(400).json({
|
|
status: false,
|
|
data: null,
|
|
message: err.message,
|
|
code: 400,
|
|
});
|
|
}
|
|
|
|
if (err) {
|
|
return res.status(400).json({
|
|
status: false,
|
|
data: null,
|
|
message: err.message || 'Error while uploading file',
|
|
code: 400,
|
|
});
|
|
}
|
|
|
|
next();
|
|
};
|
|
|
|
module.exports = {
|
|
taskUpload,
|
|
taskUploadErrorHandler,
|
|
taskUploadDir
|
|
};
|