sheercms
Version:
Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.
223 lines (204 loc) • 7.61 kB
JavaScript
var logger = require('../logger');
var api = require('../api');
var auth = require('../auth');
var path_mod = require('path');
var cms = require('sheercms');
var config = require('../config');
var multiparty = require('multiparty');
/*
callback: (err)
*/
module.exports.init = function(server, callback) {
//routes
server.get('/cms/stats/get', auth.authenticateAdmin, routeGetStats);
server.post('/cms/stats/backup', auth.authenticateAdmin, routeBackup);
server.post('/cms/stats/uploadBackup', auth.authenticateAdmin, routeUploadBackup);
server.post('/cms/stats/deleteBackup', auth.authenticateAdmin, routeDeleteBackup);
server.post('/cms/stats/restoreBackup', auth.authenticateAdmin, routeRestoreBackup);
server.get('/cms/stats/downloadBackup', auth.authenticateAdmin, routeDownloadBackup);
if (callback)
callback(null);
};
/*
GET ~/cms/stats/get
*/
function routeGetStats(req, res, next) {
try {
api.stats.getSystemStats(function(err, stats) {
if (err) {
res.json({ success: false, message: err.message });
}
else {
//get the backup list
api.stats.getBackups(function(err, backups) {
if (err) {
res.json({ success: false, message: err.message });
}
else {
res.json({ success: true, stats: stats, backups: backups });
}
});
}
});
}
catch(e) {
logger.error(e);
res.json({ success: false, message: "Error loading the system stats" });
}
}
/*
POST ~/cms/stats/backup
*/
function routeBackup(req, res, next) {
try {
var options = {
zip: true
};
api.stats.backupDatabase(options, function(err) {
if (err) {
res.json({ success: false, message: "An error occurred while trying to take a backup: " + err });
}
else {
//get the backup list
api.stats.getBackups(function(err, backups) {
if (err) {
res.json({ success: false, message: err.message });
}
else {
res.json({ success: true, message: "Database backup completed successfully!", backups: backups });
}
});
}
});
}
catch(e) {
logger.error(e);
res.json({ success: false, message: "Error while backing up the database." });
}
}
function routeDownloadBackup(req, res, next) {
var name = req.query.name;
try {
var path = api.stats.getBackupPath(name);
if (path) {
res.set({
"Content-Disposition": 'attachment; filename="' + name + '"'
});
res.sendfile(path);
}
else {
res.send(400, "Download name is invalid or not found.");
}
}
catch(e) {
logger.error(e);
res.send(400, "An error occurred trying to download this backup");
}
}
function routeDeleteBackup(req, res, next) {
var name = req.body.name;
try {
api.stats.deleteBackup(name, function(err) {
if (err) {
res.json({ success: false, message: "An error occurred while trying to delete the backup." });
}
else {
//get the backup list
api.stats.getBackups(function(err, backups) {
if (err) {
res.json({ success: false, message: err.message });
}
else {
res.json({ success: true, message: "Database backup deleted successfully!", backups: backups });
}
});
}
})
}
catch(e) {
logger.error(e);
res.json({ success: false, message: "An error occurred trying to delete this backup: " + name});
}
}
function routeRestoreBackup(req, res, next) {
var name = req.body.name;
try {
api.stats.restoreBackup(name, function(err, text) {
if (err) {
res.json({ success: false, message: "An error occurred while trying to restore the backup.", name: name, text: text });
}
else {
res.json({ success: true, message: "Database backup restored successfully!", name: name, text: text});
}
})
}
catch(e) {
logger.error(e);
res.json({ success: false, message: "An error occurred trying to restore this backup: " + name});
}
}
/*
POST ~/cms/stats/uploadBackup
*/
function routeUploadBackup(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: 100 * 1024 * 1024, //100 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 publish = (fields.publish && fields.publish.length > 0 && (fields.publish[0] == true || fields.publish[0] == "true"));
//var contentId = (fields.contentId && fields.contentId.length > 0) ? fields.contentId[0] : null;
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 obj = {
name: file.originalFilename,
path: file.path,
size: file.size,
username: username
}
api.stats.uploadBackup(obj, function(err, newPath, filename) {
if (err) {
res.json({ success: false, message: 'Error uploading the media.'});
}
else {
//get the backup list
api.stats.getBackups(function(err, backups) {
if (err) {
res.json({ success: false, message: err.message });
}
else {
res.json({ success: true, message: "Database backup uploaded successfully!", backups: backups, name: filename });
}
});
}
});
}
else
throw new Error("Uploaded file not found.");
}
}
catch(e) {
logger.error(e);
res.json({ success: false, message: 'Error uploading the media.'});
}
});
}
catch(e) {
logger.error(e);
res.json({ success: false, message: "Error while uploading the database backup file." });
}
}