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
JavaScript
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, '/');
}