diff --git a/controllers/api.js b/controllers/api.js index c5c7b0a8..b62c2ba5 100644 --- a/controllers/api.js +++ b/controllers/api.js @@ -5,7 +5,12 @@ const express = require('express') , utils = require('../utils.js') , Posts = require(__dirname+'/../models/posts.js') , Boards = require(__dirname+'/../models/boards.js') - , files = require(__dirname+'/../helpers/file.js') + , uuidv4 = require('uuid/v4') + , path = require('path') + , fileUpload = require(__dirname+'/../helpers/file-upload.js') + , fileThumbnail = require(__dirname+'/../helpers/file-thumbnail.js') + , fileIdentify = require(__dirname+'/../helpers/file-identify.js') + , fileCheckMimeType = require(__dirname+'/../helpers/file-check-mime-types.js') // make new post router.post('/board/:board', Boards.exists, async (req, res, next) => { @@ -23,15 +28,46 @@ router.post('/board/:board', Boards.exists, async (req, res, next) => { } } - let filename = ''; - //we got a file - if (req.files != null && Object.keys(req.files).length > 0) { - try { - // save and thumb it - filename = await files.uploadAndThumb(req, res); - } catch (err) { - console.error(err); - return res.status(500).json({ 'message': 'Error uploading file' }); + let files = []; + // check for file + if (req.files != null) { + // get names and amounc + const fileKeys = Object.keys(req.files); + const numFiles = fileKeys.length + // if we got a file + if (numFiles > 0) { + // check all mime types befoer we try saving anything + for (let i = 0; i < numFiles; i++) { + if (!fileCheckMimeType(req.files[fileKeys[i]].mimetype)) { + return res.status(400).json({ 'message': 'Invalid file type' }); + } + } + // then upload, thumb, get metadata, etc. + for (let i = 0; i < numFiles; i++) { + const file = req.files[fileKeys[i]]; + const filename = uuidv4() + path.extname(file.name); + // try to save, thumbnail and get metadata + try { + await fileUpload(req, res, filename); + const fileData = await fileIdentify(filename); + await fileThumbnail(filename); + files.push({ + filename: filename, + originalFilename: file.name, + mimetype: file.mimetype, + size: file.size, + dimensions: fileData.size, + geometry: fileData.Geometry, + size: fileData.Filesize + }) + } catch (err) { + console.error(err); + + //TODO: DELETE FAILED FILES + + return res.status(500).json({ 'message': 'Error uploading file' }); + } + } } } @@ -41,7 +77,7 @@ router.post('/board/:board', Boards.exists, async (req, res, next) => { 'date': new Date(), 'content': req.body.content, 'thread': req.body.thread || null, - 'file': filename + 'files': files }; const post = await Posts.insertOne(req.params.board, data) @@ -129,6 +165,19 @@ router.get('/boards', Boards.exists, async (req, res, next) => { }); +/* +(async () => { + await Boards.deleteIncrement('b'); + await Boards.deleteAll(); + await Boards.insertOne({ + _id: 'b', + name: 'random', + description: 'post anything here', + }) + await Posts.deleteAll('b'); +})(); +*/ + /* (async () => { await Boards.deleteIncrement('b'); diff --git a/helpers/filefilter.js b/helpers/file-check-mime-types.js similarity index 62% rename from helpers/filefilter.js rename to helpers/file-check-mime-types.js index bab1bc97..1f3736e3 100644 --- a/helpers/filefilter.js +++ b/helpers/file-check-mime-types.js @@ -2,4 +2,4 @@ const allowedMimeTypes = new Set(['image/jpeg', 'image/pjpeg', 'image/png', 'image/gif']); -module.exports = (file) => allowedMimeTypes.has(file.mimetype); +module.exports = (mimetype) => allowedMimeTypes.has(mimetype); diff --git a/helpers/file-identify.js b/helpers/file-identify.js new file mode 100644 index 00000000..f3e8700e --- /dev/null +++ b/helpers/file-identify.js @@ -0,0 +1,17 @@ +const gm = require('@tohru/gm') + , configs = require(__dirname+'/../configs/main.json') + , uploadDirectory = require(__dirname+'/uploadDirectory.js'); + +module.exports = (filename) => { + + return new Promise((resolve, reject) => { + gm(uploadDirectory + filename) + .identify(function (err, data) { + if (err) { + return reject(err); + } + return resolve(data) + }); + }); + +}; diff --git a/helpers/file-thumbnail.js b/helpers/file-thumbnail.js new file mode 100644 index 00000000..c578e948 --- /dev/null +++ b/helpers/file-thumbnail.js @@ -0,0 +1,19 @@ +const gm = require('@tohru/gm') + , configs = require(__dirname+'/../configs/main.json') + , uploadDirectory = require(__dirname+'/uploadDirectory.js'); + +module.exports = (filename) => { + + return new Promise((resolve, reject) => { + gm(uploadDirectory + filename) + .resize(128, 128) + .noProfile() + .write(uploadDirectory + 'thumb-' + filename, function (err) { + if (err) { + return reject(err); + } + }); + return resolve(); + }); + +}; diff --git a/helpers/file-upload.js b/helpers/file-upload.js new file mode 100644 index 00000000..f4853c08 --- /dev/null +++ b/helpers/file-upload.js @@ -0,0 +1,18 @@ +'use strict'; + +const configs = require(__dirname+'/../configs/main.json') + , uploadDirectory = require(__dirname+'/uploadDirectory.js'); + +module.exports = (req, res, filename) => { + + return new Promise((resolve, reject) => { + const file = req.files.file; + file.mv(uploadDirectory + filename, function (err) { + if (err) { + return reject(err); + } + return resolve() + }); + }); + +}; diff --git a/helpers/file.js b/helpers/file.js deleted file mode 100644 index 7fd620f4..00000000 --- a/helpers/file.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; -const isValidFile = require(__dirname+'/filefilter.js') - , path = require('path') - , uploadDest = path.join(__dirname, '/../static/img/') - , uuidv4 = require('uuid/v4') - , gm = require('@tohru/gm'); - -module.exports = { - - uploadDest, - - uploadAndThumb: (req, res) => { - return new Promise((resolve, reject) => { - const file = req.files.file; - //check type - if (!isValidFile(file)) { - return reject(new Error('Unsupported file type')) - } - //save it - const filename = uuidv4() + path.extname(file.name); - file.mv(uploadDest + filename, function (err) { - if (err) { - return reject(err); - } - //thumbnail it - gm(uploadDest + filename) - .resize(128, 128) - .noProfile() - .write(uploadDest + 'thumb-' + filename, function (err) { - if (err) { - return reject(err); - } - return resolve(filename); - }); - }); - }); - }, - -}; diff --git a/helpers/uploadDirectory.js b/helpers/uploadDirectory.js new file mode 100644 index 00000000..c8f9f529 --- /dev/null +++ b/helpers/uploadDirectory.js @@ -0,0 +1,6 @@ +'use strict'; + +const path = require('path'); +const directory = path.join(__dirname+'/../static/img/') + +module.exports = directory;