aboutsummaryrefslogtreecommitdiff
path: root/controllers/uploadController.js
diff options
context:
space:
mode:
Diffstat (limited to 'controllers/uploadController.js')
-rw-r--r--controllers/uploadController.js68
1 files changed, 47 insertions, 21 deletions
diff --git a/controllers/uploadController.js b/controllers/uploadController.js
index 9f10c8c..d5615d0 100644
--- a/controllers/uploadController.js
+++ b/controllers/uploadController.js
@@ -9,12 +9,25 @@ const utils = require('./utilsController.js');
const uploadsController = {};
+// Let's default it to only 1 try
+const maxTries = config.uploads.maxTries || 1;
+const uploadDir = path.join(__dirname, '..', config.uploads.folder);
+
const storage = multer.diskStorage({
destination: function(req, file, cb) {
- cb(null, path.join(__dirname, '..', config.uploads.folder));
+ cb(null, uploadDir);
},
filename: function(req, file, cb) {
- cb(null, randomstring.generate(config.uploads.fileLength) + path.extname(file.originalname));
+ const access = i => {
+ const name = randomstring.generate(config.uploads.fileLength) + path.extname(file.originalname);
+ fs.access(path.join(uploadDir, name), err => {
+ if (err) return cb(null, name);
+ console.log(`A file named "${name}" already exists (${++i}/${maxTries}).`);
+ if (i < maxTries) return access(i);
+ return cb('Could not allocate a unique file name. Try again?');
+ });
+ };
+ access(0);
}
});
@@ -39,6 +52,10 @@ uploadsController.upload = async (req, res, next) => {
const token = req.headers.token || '';
const user = await db.table('users').where('token', token).first();
+ if (user && (user.enabled === false || user.enabled === 0)) return res.json({
+ success: false,
+ description: 'This account has been disabled'
+ });
const albumid = req.headers.albumid || req.params.albumid;
if (albumid && user) {
@@ -54,7 +71,7 @@ uploadsController.upload = async (req, res, next) => {
return uploadsController.actuallyUpload(req, res, user, albumid);
};
-uploadsController.actuallyUpload = async (req, res, userid, album) => {
+uploadsController.actuallyUpload = async (req, res, userid, albumid) => {
upload(req, res, async err => {
if (err) {
console.error(err);
@@ -97,7 +114,7 @@ uploadsController.actuallyUpload = async (req, res, userid, album) => {
size: file.size,
hash: fileHash,
ip: req.ip,
- albumid: album,
+ albumid: albumid,
userid: userid !== undefined ? userid.id : null,
timestamp: Math.floor(Date.now() / 1000)
});
@@ -107,7 +124,7 @@ uploadsController.actuallyUpload = async (req, res, userid, album) => {
}
if (iteration === req.files.length) {
- return uploadsController.processFilesForDisplay(req, res, files, existingFiles);
+ return uploadsController.processFilesForDisplay(req, res, files, existingFiles, albumid);
}
iteration++;
});
@@ -115,7 +132,7 @@ uploadsController.actuallyUpload = async (req, res, userid, album) => {
});
};
-uploadsController.processFilesForDisplay = async (req, res, files, existingFiles) => {
+uploadsController.processFilesForDisplay = async (req, res, files, existingFiles, albumid) => {
let basedomain = config.domain;
if (files.length === 0) {
return res.json({
@@ -133,29 +150,38 @@ uploadsController.processFilesForDisplay = async (req, res, files, existingFiles
await db.table('files').insert(files);
for (let efile of existingFiles) files.push(efile);
- res.json({
- success: true,
- files: files.map(file => {
- return {
- name: file.name,
- size: file.size,
- url: `${basedomain}/${file.name}`
- };
- })
- });
-
for (let file of files) {
let ext = path.extname(file.name).toLowerCase();
if (utils.imageExtensions.includes(ext) || utils.videoExtensions.includes(ext)) {
file.thumb = `${basedomain}/thumbs/${file.name.slice(0, -ext.length)}.png`;
utils.generateThumbs(file);
}
+ }
- if (file.albumid) {
- db.table('albums').where('id', file.albumid).update('editedAt', file.timestamp).then(() => {})
- .catch(error => { console.log(error); res.json({ success: false, description: 'Error updating album' }); });
- }
+ let albumSuccess = true;
+ if (albumid) {
+ const editedAt = Math.floor(Date.now() / 1000)
+ albumSuccess = await db.table('albums')
+ .where('id', albumid)
+ .update('editedAt', editedAt)
+ .then(() => true)
+ .catch(error => {
+ console.log(error);
+ return false;
+ });
}
+
+ return res.json({
+ success: albumSuccess,
+ description: albumSuccess ? null : 'Warning: Error updating album.',
+ files: files.map(file => {
+ return {
+ name: file.name,
+ size: file.size,
+ url: `${basedomain}/${file.name}`
+ };
+ })
+ });
};
uploadsController.delete = async (req, res) => {