sheercms
Version:
Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.
281 lines (232 loc) • 8.71 kB
JavaScript
var logger = require('../logger');
var api = require('../api');
var auth = require('../auth');
var config = require('../config');
var path_mod = require('path');
var cms = require('sheercms');
var multiparty = require('multiparty');
/*
callback: (err)
*/
module.exports.init = function(server, callback) {
//routes
server.get('/cms/packages/list', auth.authenticateAdmin, routePackageList);
server.get('/cms/packages/get', auth.authenticateAdmin, routePackageGet);
server.post('/cms/packages/create', auth.authenticateAdmin, routePackageCreate);
server.post('/cms/packages/update', auth.authenticateAdmin, routePackageUpdate);
server.post('/cms/packages/delete', auth.authenticateAdmin, routePackageDelete);
server.post('/cms/packages/build', auth.authenticateAdmin, routePackageBuild);
server.get('/cms/packages/download', auth.authenticateAdmin, routePackageDownload);
server.post('/cms/packages/upload', auth.authenticateAdmin, routePackageUpload);
server.post('/cms/packages/validate', auth.authenticateAdmin, routePackageValidate);
if (callback)
callback(null);
};
function routePackageList(req, res, next) {
try {
api.packages.getPackages(function(err, results) {
if (err)
res.json({ success: false, message: err.message });
else
res.json({ success: true, packages: results });
});
} catch(e) {
logger.error(e);
res.json({ success: false, message: 'Error retrieving the list of packages.'});
}
}
function routePackageGet(req, res, next) {
try {
var id = req.query.packageId;
api.packages.getPackage(id, function(err, result) {
if (err)
res.json({ success: false, message: err.message });
else
res.json({ success: true, package: result });
});
} catch(e) {
logger.error(e);
res.json({ success: false, message: 'Error retrieving the package.'});
}
}
function routePackageCreate(req, res, next) {
try {
var name = req.body.name;
api.packages.createPackage(name, function(err, savedPkg) {
if (err)
res.json({ success: false, message: err.message });
else
res.json({ success: true, package: savedPkg });
});
} catch(e) {
logger.error(e);
res.json({ success: false, message: 'Error creating the package.'});
}
}
function routePackageUpdate(req, res, next) {
try {
var json = req.body.data;
var pkg = JSON.parse(json);
//var username = req.user.username;
//fix the package items
pkg.items = fixPackageItems(pkg.items);
api.packages.updatePackage(pkg, function(err, savedPkg) {
if (err)
res.json({ success: false, message: err.message });
else
res.json({ success: true, package: savedPkg });
});
} catch(e) {
logger.error(e);
res.json({ success: false, message: 'Error updating the package.'});
}
}
function fixPackageItems(items) {
var arr = [];
if (items) {
for(var i = 0; i < items.length; i++) {
var item = items[i];
var obj = new PackageItem(item);
arr.push(obj);
}
}
return arr;
}
function routePackageDelete(req, res, next) {
try {
var id = req.body.packageId;
api.packages.deletePackage(id, function(err) {
if (err)
res.json({ success: false, message: err.message });
else
res.json({ success: true, message: 'Package deleted successfully!' });
});
} catch(e) {
logger.error(e);
res.json({ success: false, message: 'Error deleting the package.'});
}
}
function routePackageBuild(req, res, next) {
try {
var id = req.body.packageId;
api.packages.buildPackage(id, function(err, result) {
if (err)
res.json({ success: false, message: err.message });
else
res.json({ success: true, message: 'Package built successfully!' });
});
} catch(e) {
logger.error(e);
res.json({ success: false, message: 'Error building the package.'});
}
}
function routePackageDownload(req, res, next) {
try {
var id = req.query.id;
api.packages.getPackage(id, function(err, pkg) {
if (err)
res.json({ success: false, message: err.message });
else if (pkg && pkg.filename && pkg.filename.length > 0) {
var settings = api.packages.getPackageSettings();
var filename = pkg.filename.replace('.zip', '') + '.zip'
res.set({
"Content-Disposition": 'attachment; filename="' + filename + '"'
});
res.sendfile(path_mod.join(settings.path, filename));
}
else {
var e = new Error('Invalid package or package filename.');
logger.error(e);
res.json({ success: false, message: e.message });
}
});
} catch(e) {
logger.error(e);
res.json({ success: false, message: 'Error downloading the package.'});
}
}
function routePackageValidate(req, res, next) {
try {
var id = req.body.packageId;
api.packages.validatePackage(id, function(err, result) {
if (err)
res.json({ success: false, message: err.message });
else
res.json({ success: true, message: result.message, valid: result.valid, invalidItems: result.invalidItems });
});
}
catch(e) {
logger.error(e);
res.json({ success: false, message: 'Error validating the package.'});
}
}
function routePackageUpload(req, res, next) {
try {
var username = req.user.username;
var uploadDir = path_mod.join(cms.getRoot(), 'temp/uploads');
logger.info("Using upload directory: " + uploadDir);
// parse a file upload
var form = new multiparty.Form({
maxFilesSize: 20 * 1024 * 1024, //20 MB
uploadDir: uploadDir
});
var count = 0;
form.parse(req, function(err, fields, files) {
try {
if (err) {
logger.error(err);
res.json({ success: false, message: err.message});
}
else {
var fileArr = files.file; //only one file uploaded at a time
if (fileArr && fileArr.length > 0) {
var file = fileArr[0];
logger.info("File uploaded to: " + file.path);
var opt = {
name: file.originalFilename,
path: file.path,
size: file.size,
username: username
};
var results = [];
api.packages.installPackage(opt, function(result) {
//onProgress
//result: {package, item, value, total, status, message}
results.push({
message: result.message,
status: result.status
});
}, function(err, pkg) {
if (err) {
res.json({ success: false, message: err.message, results: results });
}
else {
res.json({
success: true,
message: "Package installed successfully!",
results: results
});
}
});
}
}
}
catch(e) {
logger.error(e);
res.json({ success: false, message: 'Error installing the package.'});
}
});
} catch(e) {
logger.error(e);
res.json({ success: false, message: 'Error installing the package.'});
}
}
function PackageItem(item) {
var self = this;
self.itemId = item.itemId;
self.itemType = item.itemType;
self.name = item.name;
self.recursive = item.recursive;
self.overwrite = item.overwrite;
self.publish = item.publish;
}