diff options
Diffstat (limited to 'controllers/uploadController.js')
| -rw-r--r-- | controllers/uploadController.js | 68 |
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) => { |