diff --git a/src/image.js b/src/image.js index fca120d1e5..f1e12c81d5 100644 --- a/src/image.js +++ b/src/image.js @@ -1,11 +1,11 @@ 'use strict'; -var fs = require('fs'), - Jimp = require('jimp'), - async = require('async'), - plugins = require('./plugins'); +var fs = require('fs'); +var Jimp = require('jimp'); +var async = require('async'); +var plugins = require('./plugins'); -var image = {}; +var image = module.exports; image.resizeImage = function(data, callback) { if (plugins.hasListeners('filter:image.resize')) { @@ -106,12 +106,10 @@ image.size = function(path, callback) { callback(err, data ? data.bitmap : null); }); } -} +}; image.convertImageToBase64 = function(path, callback) { fs.readFile(path, function(err, data) { callback(err, data ? data.toString('base64') : null); }); }; - -module.exports = image; diff --git a/src/routes/debug.js b/src/routes/debug.js index a24a159e18..a2191d8ffa 100644 --- a/src/routes/debug.js +++ b/src/routes/debug.js @@ -1,12 +1,12 @@ "use strict"; -var express = require('express'), - nconf = require('nconf'), - winston = require('winston'), - user = require('./../user'), - categories = require('./../categories'), - topics = require('./../topics'), - posts = require('./../posts'); +var express = require('express'); +var nconf = require('nconf'); +var winston = require('winston'); +var user = require('./../user'); +var categories = require('./../categories'); +var topics = require('./../topics'); +var posts = require('./../posts'); module.exports = function(app, middleware, controllers) { var router = express.Router(); diff --git a/src/topics.js b/src/topics.js index 4cb795b2c3..7d9938987a 100644 --- a/src/topics.js +++ b/src/topics.js @@ -14,7 +14,6 @@ var social = require('./social'); (function(Topics) { - require('./topics/data')(Topics); require('./topics/create')(Topics); require('./topics/delete')(Topics); @@ -29,6 +28,7 @@ var social = require('./social'); require('./topics/teaser')(Topics); require('./topics/suggested')(Topics); require('./topics/tools')(Topics); + require('./topics/thumb')(Topics); Topics.exists = function(tid, callback) { db.isSortedSetMember('topics:tid', tid, callback); diff --git a/src/topics/create.js b/src/topics/create.js index de55045ed8..db4976678c 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -21,6 +21,9 @@ module.exports = function(Topics) { var topicData; async.waterfall([ + function(next) { + Topics.resizeAndUploadThumb(data, next); + }, function(next) { db.incrObjectField('global', 'nextTid', next); }, diff --git a/src/topics/thumb.js b/src/topics/thumb.js new file mode 100644 index 0000000000..5829e080c4 --- /dev/null +++ b/src/topics/thumb.js @@ -0,0 +1,91 @@ + +'use strict'; + +var async = require('async'); +var nconf = require('nconf'); +var winston = require('winston'); +var path = require('path'); +var fs = require('fs'); +var request = require('request'); +var mime = require('mime'); +var validator = require('validator'); + +var meta = require('../meta'); +var image = require('../image'); +var file = require('../file'); +var plugins = require('../plugins'); + +module.exports = function(Topics) { + + Topics.resizeAndUploadThumb = function(data, callback) { + if (!data.thumb || !validator.isURL(data.thumb)) { + return callback(); + } + + var pathToUpload; + var filename; + + async.waterfall([ + function(next) { + request.head(data.thumb, next); + }, + function(res, body, next) { + + var type = res.headers['content-type']; + if (!type.match(/image./)) { + return next(new Error('[[error:invalid-file]]')); + } + + var extension = path.extname(data.thumb); + if (!extension) { + extension = '.' + mime.extension(type); + } + filename = Date.now() + '-topic-thumb' + extension; + pathToUpload = path.join(nconf.get('base_dir'), nconf.get('upload_path'), 'files', filename); + + request(data.thumb).pipe(fs.createWriteStream(pathToUpload)).on('close', next); + }, + function(next) { + file.isFileTypeAllowed(pathToUpload, next); + }, + function(next) { + var size = parseInt(meta.config.topicThumbSize, 10) || 120; + image.resizeImage({ + path: pathToUpload, + extension: path.extname(pathToUpload), + width: size, + height: size + }, next); + }, + function(next) { + if (!plugins.hasListeners('filter:uploadImage')) { + data.thumb = path.join(nconf.get('upload_url'), 'files', filename); + return callback(); + } + + plugins.fireHook('filter:uploadImage', {image: {path: pathToUpload, name: ''}, uid: data.uid}, next); + }, + function(uploadedFile, next) { + deleteFile(pathToUpload); + data.thumb = uploadedFile.url; + next(); + } + ], function(err) { + if (err) { + deleteFile(pathToUpload); + } + callback(err); + }); + }; + + function deleteFile(path) { + if (path) { + fs.unlink(path, function(err) { + if (err) { + winston.error(err); + } + }); + } + } + +};