UNPKG

alphascript-server

Version:

CRUD operations for mongo and other functionalities to get started quickly in any CMS project

117 lines (100 loc) 4.03 kB
var fs = require('fs'); var path = require('path'); var mkdirp = require('mkdirp'); var api = require('../../'); var Q = require('q'); var formidable = require('formidable'); var uid = require('rand-token').uid; var main = module.exports = { download: function (req, res) { var id = req.params.id; api.common.Document.findOne({ _id: id }).lean().exec(function (err, doc) { if (err) { api.error.log(err); return res.status(500).send(api.error.DB_GENERIC); } if (!doc) return res.status(404).send("O documento que procura não existe"); api.activity.log("document.download", doc.filepath + ' (' + id + ')', req); var url = api.options.publicRoot + doc.filepath; res.download(url); }); }, upload: function (req, entity, id, key, file) { var deferred = Q.defer(); //create directory var identifier = id ? id.toString() : uid(16); var relPath = path.join(api.options.fsRoot, entity, identifier); mkdirp(relPath, function (err) { if (err) { api.error.log(err); return deferred.reject("Não foi possível criar o directório para o seu upload de momento, por favor tente novamente"); } //read uploaded temporary file var tmpFilepath = file.path; fs.readFile(tmpFilepath, function (err, data) { if (err) { api.error.log(err); return deferred.reject("Não foi possível proceder à leitura do upload de momento, por favor tente novamente"); } //delete uploaded temporary file fs.unlink(tmpFilepath, function (err) { if (err) { api.error.log(err); return deferred.reject("Não foi possível limpar os ficheiros temporários de upload, por favor tente novamente"); } //remove special characters from filename file.name = uid(16) + "." + removeSpecialChars(file.name); //rewrite upload to new path var filepath = replaceSlashes(path.join(relPath, file.name)); fs.writeFile(path.resolve(filepath), data, function (err) { if (err) { api.error.log(err); return deferred.reject("Não foi possível proceder à escrita do upload de momento, por favor tente novamente"); } //save to DB new api.common.Document({ filename: file.name, size: file.size, type: file.type, lastModifiedDate: file.lastModifiedDate, hash: file.hash, domain: file.domain, filepath: filepath.substring(api.options.publicRoot.length), owner: req.user ? req.user._id : null }).save(function (err, savedItem) { if (err) { api.error.log(err); return deferred.reject(api.error.DB_GENERIC); } api.activity.log("document.upload", savedItem.filepath, req); deferred.resolve({ key: key, document: savedItem }); }); }); }); }); }); return deferred.promise; }, uploadImage: function (req, res) { var key = req.params.key; var form = new formidable.IncomingForm(); form.parse(req, function (err, fields, files) { if (err) { api.error.log(err); return res.status(500).send("Não foi possível receber o seu pedido, por favor tente novamente"); } main.upload(req, 'upload', 'image', uid(16), files[key]).then(function (response) { res.send(response.document.filepath); }).catch(function (response) { api.error.log(response); res.status(500).send("Não foi possível receber o seu pedido, por favor tente novamente"); }); }); } }; function removeSpecialChars(str) { return str.replace(/(?!\w|\s|\.|\-)./g, ' ').replace(/\s+/g, ' ').replace(/^(\s*)([\W\w]*)(\b\s*$)/g, '$2'); } function replaceSlashes(str) { return str.replace(/\\/g, '/').replace(/\/\//g, '/'); }