diff options
| author | Pitu <[email protected]> | 2017-03-17 01:14:24 -0300 |
|---|---|---|
| committer | Pitu <[email protected]> | 2017-03-17 01:14:24 -0300 |
| commit | 1db1b06a48ce3775596a994a9f1360108814bf0d (patch) | |
| tree | cebe3861cb9426d7cac16e5cd5a04ecd063911b0 /controllers/uploadController.js | |
| parent | Moved thumbnail processing to it's own utils file (diff) | |
| download | host.fuwn.me-1db1b06a48ce3775596a994a9f1360108814bf0d.tar.xz host.fuwn.me-1db1b06a48ce3775596a994a9f1360108814bf0d.zip | |
Refactor
Diffstat (limited to 'controllers/uploadController.js')
| -rw-r--r-- | controllers/uploadController.js | 206 |
1 files changed, 78 insertions, 128 deletions
diff --git a/controllers/uploadController.js b/controllers/uploadController.js index 563dfa8..1f15786 100644 --- a/controllers/uploadController.js +++ b/controllers/uploadController.js @@ -1,20 +1,19 @@ const path = require('path') const config = require('../config.js') -const multer = require('multer') +const multer = require('multer') const randomstring = require('randomstring') const db = require('knex')(config.database) const crypto = require('crypto') const fs = require('fs') -const gm = require('gm') -const ffmpeg = require('fluent-ffmpeg') +const utils = require('utilsController.js') let uploadsController = {} const storage = multer.diskStorage({ - destination: function (req, file, cb) { - cb(null, './' + config.uploads.folder + '/') + destination: function(req, file, cb) { + cb(null, path.join(__dirname, '..', config.uploads.folder)) }, - filename: function (req, file, cb) { + filename: function(req, file, cb) { cb(null, randomstring.generate(config.uploads.fileLength) + path.extname(file.originalname)) } }) @@ -24,28 +23,27 @@ const upload = multer({ limits: { fileSize: config.uploads.maxSize } }).array('files[]') -uploadsController.upload = function(req, res, next){ +uploadsController.upload = function(req, res, next) { // Get the token let token = req.headers.token // If we're running in private and there's no token, error - if(config.private === true) - if(token === undefined) return res.status(401).json({ success: false, description: 'No token provided' }) + if (config.private === true) + if (token === undefined) return res.status(401).json({ success: false, description: 'No token provided' }) // If there is no token then just leave it blank so the query fails - if(token === undefined) token = '' - + if (token === undefined) token = '' + db.table('users').where('token', token).then((user) => { let userid - if(user.length > 0) - userid = user[0].id + if (user.length > 0) userid = user[0].id // Check if user is trying to upload to an album - let album = undefined - if(userid !== undefined){ + let album + if (userid !== undefined) { album = req.headers.albumid - if(album === undefined) + if (album === undefined) album = req.params.albumid } @@ -58,7 +56,7 @@ uploadsController.upload = function(req, res, next){ }) } - if(req.files.length === 0) return res.json({ success: false, description: 'no-files' }) + if (req.files.length === 0) return res.json({ success: false, description: 'no-files' }) let files = [] let existingFiles = [] @@ -68,18 +66,18 @@ uploadsController.upload = function(req, res, next){ // Check if the file exists by checking hash and size let hash = crypto.createHash('md5') - let stream = fs.createReadStream('./' + config.uploads.folder + '/' + file.filename) + let stream = fs.createReadStream(path.join(__dirname, '..', config.uploads.folder, file.filename)) stream.on('data', function (data) { hash.update(data, 'utf8') }) stream.on('end', function () { - let fileHash = hash.digest('hex') // 34f7a3113803f8ed3b8fd7ce5656ebec + let fileHash = hash.digest('hex') db.table('files') - .where(function(){ - if(userid === undefined) + .where(function() { + if (userid === undefined) this.whereNull('userid') else this.where('userid', userid) @@ -89,10 +87,10 @@ uploadsController.upload = function(req, res, next){ size: file.size }).then((dbfile) => { - if(dbfile.length !== 0){ + if (dbfile.length !== 0) { uploadsController.deleteFile(file.filename).then(() => {}).catch((e) => console.error(e)) existingFiles.push(dbfile[0]) - }else{ + } else { files.push({ name: file.filename, original: file.originalname, @@ -106,26 +104,25 @@ uploadsController.upload = function(req, res, next){ }) } - if(iteration === req.files.length) + if (iteration === req.files.length) return uploadsController.processFilesForDisplay(req, res, files, existingFiles) iteration++ - - }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) + }).catch(function(error) { console.log(error); res.json({ success: false, description: 'error' }) }) }) }) }) - }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) + }).catch(function(error) { console.log(error); res.json({ success: false, description: 'error' }) }) } -uploadsController.processFilesForDisplay = function(req, res, files, existingFiles){ +uploadsController.processFilesForDisplay = function(req, res, files, existingFiles) { let basedomain = req.get('host') - for(let domain of config.domains) - if(domain.host === req.get('host')) - if(domain.hasOwnProperty('resolve')) + for (let domain of config.domains) + if (domain.host === req.get('host')) + if (domain.hasOwnProperty('resolve')) basedomain = domain.resolve - if(files.length === 0){ + if (files.length === 0) { return res.json({ success: true, files: existingFiles.map(file => { @@ -140,7 +137,7 @@ uploadsController.processFilesForDisplay = function(req, res, files, existingFil db.table('files').insert(files).then(() => { - for(let efile of existingFiles) files.push(efile) + for (let efile of existingFiles) files.push(efile) res.json({ success: true, @@ -153,55 +150,54 @@ uploadsController.processFilesForDisplay = function(req, res, files, existingFil }) }) - for (let file of files){ - uploadsController.generateThumbs(file, basedomain) + for (let file of files) { + utils.generateThumbs(file) } - }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) + }).catch(function(error) { console.log(error); res.json({ success: false, description: 'error' }) }) } -uploadsController.delete = function(req, res){ +uploadsController.delete = function(req, res) { let token = req.headers.token - if(token === undefined) return res.status(401).json({ success: false, description: 'No token provided' }) + if (token === undefined) return res.status(401).json({ success: false, description: 'No token provided' }) let id = req.body.id - if(id === undefined || id === '') + if (id === undefined || id === '') return res.json({ success: false, description: 'No file specified' }) db.table('users').where('token', token).then((user) => { - if(user.length === 0) return res.status(401).json({ success: false, description: 'Invalid token'}) + if (user.length === 0) return res.status(401).json({ success: false, description: 'Invalid token' }) db.table('files') .where('id', id) - .where(function(){ - if(user[0].username !== 'root') + .where(function() { + if (user[0].username !== 'root') this.where('userid', user[0].id) }) .then((file) => { uploadsController.deleteFile(file[0].name).then(() => { - db.table('files').where('id', id).del().then(() =>{ + db.table('files').where('id', id).del().then(() => { return res.json({ success: true }) - }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) + }).catch(function(error) { console.log(error); res.json({ success: false, description: 'error' }) }) }).catch((e) => { console.log(e.toString()) - db.table('files').where('id', id).del().then(() =>{ + db.table('files').where('id', id).del().then(() => { return res.json({ success: true }) - }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) + }).catch(function(error) { console.log(error); res.json({ success: false, description: 'error' }) }) }) - }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) - }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) - + }).catch(function(error) { console.log(error); res.json({ success: false, description: 'error' }) }) + }).catch(function(error) { console.log(error); res.json({ success: false, description: 'error' }) }) } -uploadsController.deleteFile = function(file){ +uploadsController.deleteFile = function(file) { - return new Promise(function(resolve, reject){ - fs.stat('./' + config.uploads.folder + '/' + file, function (err, stats) { + return new Promise(function(resolve, reject) { + fs.stat(path.join(__dirname, '..', config.uploads.folder, file), function(err, stats) { if (err) { return reject(err) } - fs.unlink('./' + config.uploads.folder + '/' + file, function(err){ + fs.unlink(path.join(__dirname, '..', config.uploads.folder, file), function(err) { if (err) { return reject(err) } return resolve() }) @@ -210,26 +206,26 @@ uploadsController.deleteFile = function(file){ } -uploadsController.list = function(req, res){ +uploadsController.list = function(req, res) { let token = req.headers.token - if(token === undefined) return res.status(401).json({ success: false, description: 'No token provided' }) + if (token === undefined) return res.status(401).json({ success: false, description: 'No token provided' }) db.table('users').where('token', token).then((user) => { - if(user.length === 0) return res.status(401).json({ success: false, description: 'Invalid token'}) + if (user.length === 0) return res.status(401).json({ success: false, description: 'Invalid token'}) let offset = req.params.page - if(offset === undefined) offset = 0 + if (offset === undefined) offset = 0 db.table('files') - .where(function(){ - if(req.params.id === undefined) + .where(function() { + if (req.params.id === undefined) this.where('id', '<>', '') else this.where('albumid', req.params.id) }) - .where(function(){ - if(user[0].username !== 'root') + .where(function() { + if (user[0].username !== 'root') this.where('userid', user[0].id) }) .orderBy('id', 'DESC') @@ -240,96 +236,50 @@ uploadsController.list = function(req, res){ db.table('albums').then((albums) => { let basedomain = req.get('host') - for(let domain of config.domains) - if(domain.host === req.get('host')) - if(domain.hasOwnProperty('resolve')) + for (let domain of config.domains) + if (domain.host === req.get('host')) + if (domain.hasOwnProperty('resolve')) basedomain = domain.resolve let userids = [] - for(let file of files){ + for (let file of files) { file.file = basedomain + '/' + file.name file.date = new Date(file.timestamp * 1000) - file.date = file.date.getFullYear() + '-' + (file.date.getMonth() + 1) + '-' + file.date.getDate() + ' ' + (file.date.getHours() < 10 ? '0' : '') + file.date.getHours() + ':' + (file.date.getMinutes() < 10 ? '0' : '') + file.date.getMinutes() + ':' + (file.date.getSeconds() < 10 ? '0' : '') + file.date.getSeconds() + file.date = utils.getPrettyDate(file.date) // file.date.getFullYear() + '-' + (file.date.getMonth() + 1) + '-' + file.date.getDate() + ' ' + (file.date.getHours() < 10 ? '0' : '') + file.date.getHours() + ':' + (file.date.getMinutes() < 10 ? '0' : '') + file.date.getMinutes() + ':' + (file.date.getSeconds() < 10 ? '0' : '') + file.date.getSeconds() file.album = '' - if(file.albumid !== undefined) - for(let album of albums) - if(file.albumid === album.id) + if (file.albumid !== undefined) + for (let album of albums) + if (file.albumid === album.id) file.album = album.name // Only push usernames if we are root - if(user[0].username === 'root') - if(file.userid !== undefined && file.userid !== null && file.userid !== '') + if (user[0].username === 'root') + if (file.userid !== undefined && file.userid !== null && file.userid !== '') userids.push(file.userid) - uploadsController.generateThumbs(file, basedomain) + utils.generateThumbs(file) } // If we are a normal user, send response - if(user[0].username !== 'root') return res.json({ success: true, files }) + if (user[0].username !== 'root') return res.json({ success: true, files }) // If we are root but there are no uploads attached to a user, send response - if(userids.length === 0) return res.json({ success: true, files }) - + if (userids.length === 0) return res.json({ success: true, files }) + db.table('users').whereIn('id', userids).then((users) => { - for(let user of users) - for(let file of files) - if(file.userid === user.id) + for (let user of users) + for (let file of files) + if (file.userid === user.id) file.username = user.username return res.json({ success: true, files }) - }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) - }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) - }).catch(function(error) { console.log(error); res.json({success: false, description: 'error'}) }) - - }) -} - -uploadsController.generateThumbs = function(file, basedomain){ - if(config.uploads.generateThumbnails !== true) return - - let extensions = ['.jpg', '.jpeg', '.bmp', '.gif', '.png', '.webm', '.mp4'] - for(let ext of extensions){ - if(path.extname(file.name).toLowerCase() === ext){ - - let thumbname = path.join(__dirname, '..', config.uploads.folder, 'thumbs', file.name.slice(0, -ext.length) + '.png') - fs.access(thumbname, function(err) { - if (err && err.code === 'ENOENT') { - // File doesnt exist - - if (ext === '.webm' || ext === '.mp4') { - ffmpeg(path.join(__dirname, '..', config.uploads.folder, file.name)) - .thumbnail({ - timestamps: [0], - filename: '%b.png', - folder: path.join(__dirname, '..', config.uploads.folder, 'thumbs'), - size: '200x?' - }) - .on('error', function(error) { - console.log('Error - ', error.message) - }) - } - else { - let size = { - width: 200, - height: 200 - } - - gm(path.join(__dirname, '..', config.uploads.folder, file.name)) - .resize(size.width, size.height + '>') - .gravity('Center') - .extent(size.width, size.height) - .background('transparent') - .write(thumbname, function (error) { - if (error) console.log('Error - ', error) - }) - } - } - }) - } - } + }).catch(function(error) { console.log(error); res.json({ success: false, description: 'error' }) }) + }).catch(function(error) { console.log(error); res.json({ success: false, description: 'error' }) }) + }).catch(function(error) { console.log(error); res.json({ success: false, description: 'error' }) }) + }) } module.exports = uploadsController |