sheercms
Version:
Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.
256 lines (225 loc) • 10.7 kB
JavaScript
var logger = require('../logger');
var api = require('../api');
var auth = require('../auth');
var config = require('../config');
var view = require('../view');
var async = require('async');
/*
callback: (err)
*/
module.exports.init = function(server, callback) {
//routes
server.post('/cms/designer/toolbar', auth.authenticate, routeDesignerToolbar);
server.post('/cms/designer/command', auth.authenticate, routeDesignerCommand);
if (callback)
callback(null);
};
function routeDesignerToolbar(req, res, next) {
try {
var errorMsg = "Error loading the designer toolbar!";
var contentId = req.body.contentId;
var model = {
buttons: [],
item: null
};
//load this content item from the API
api.content.getContent({contentId: contentId}, function(err, item) {
try {
if (err) {
res.send(errorMsg);
}
else if (item === null) {
logger.error(new Error("routeDesignerToolbar - Content item not found: " + contentId));
res.send(errorMsg);
}
else {
//get the item's group
api.groups.getGroup(item.groupId, function(err, group) {
try {
if (err) {
res.send(errorMsg);
}
else if (group === null) {
logger.error(new Error("routeDesignerToolbar - Group not found for content item: " + contentId + "; groupId: " + item.groupId));
res.send(errorMsg);
}
else {
model.item = item;
model.group = group;
var rights = api.groups.getGroupRights(group, req.user);
if (rights && rights.read === true && rights.update === true) {
//add buttons to array
model.buttons.push(new ToolbarButton('Preview', 'preview', null, '/cms/static/images/icons/32/page_white_magnify.png', 'Preview your changes to this page'));
model.buttons.push(new ToolbarButton('Save', 'save', null, '/cms/static/images/icons/32/accept.png', 'Save your changes to this page'));
if (rights.publish === true) {
model.buttons.push(new ToolbarButton('Publish', 'publish', null, '/cms/static/images/icons/32/world_go.png', 'Publish this page to the live website'));
model.buttons.push(new ToolbarButton('Un-Publish', 'unpublish', null, '/cms/static/images/icons/32/world_delete.png', 'Un-publish this page - removes the page from the live website'));
}
model.buttons.push(new ToolbarButton('Outline', 'outline', null, '/cms/static/images/icons/32/outline.png', 'Show outline around editable fields'));
model.buttons.push(new ToolbarButton('Reload', 'reload', null, '/cms/static/images/icons/32/update.png', 'Reload this page'));
model.buttons.push(new ToolbarButton('Exit', 'exit', null, '/cms/static/images/icons/32/cancel.png', 'Exit design mode'));
view.renderFile('/designer/toolbar', model, function (err, output) {
if (err) {
logger.error(err);
res.send(errorMsg);
}
else
res.send(output);
});
}
else {
logger.warn("This user does not have access to edit this page: " + req.user.username);
res.send("You do not have access to edit this page.");
}
}
}
catch(e)
{
logger.error(e);
res.send(errorMsg);
}
});
}
}
catch(e) {
logger.error(e);
res.send(errorMsg);
}
});
}
catch(e) {
logger.error(e);
res.send(errorMsg);
}
}
function routeDesignerCommand(req, res, next) {
try {
var errorMsg = "Error executing the command!";
var username = req.user.username;
var pageId = req.body.contentId;
var sData = req.body.json;
console.log(sData);
var cmd = req.body.command;
var data = (sData && sData.length > 0) ? JSON.parse(sData) : null;
if (cmd === 'save' || cmd === 'publish') {
if (!data || !data.fields) {
logger.error(new Error("JSON data or data.fields is null from designer."));
res.send({success: false, message: errorMsg});
}
else {
var items = [];
var ids = [];
var idHash = {};
var results = [];
//get the distinct item ids
for(var i = 0; i < data.fields.length; i++) {
var f = data.fields[i];
if (!idHash[f.itemId]) {
idHash[f.itemId] = 1;
ids.push(f.itemId);
}
}
async.each(ids, function (contentId, done) {
logger.info("routeDesignerCommand - Saving data for contentId: " + contentId);
api.content.getContent({contentId: contentId}, function(err, item) {
if (err)
done(err);
else if (!item)
done(new Error("Content item does not exist: " + contentId));
else {
var fieldNames = [];
if (!item.fields)
item.fields = {};
//update the field values
for(var i = 0; i < data.fields.length; i++) {
var f = data.fields[i];
if (f.itemId === contentId) {
item.fields[f.fieldName] = f.value;
fieldNames.push(f.fieldName);
}
}
//save the item
api.content.updateContent(item, username, function(err, savedItem) {
var success = !err && savedItem;
var result = {
itemId: contentId,
status: savedItem.status,
fields: fieldNames,
success: success
};
results.push(result);
if (cmd === 'publish') {
api.content.publishContent(contentId, username, function(err, draftItem, pubItem) {
if (err)
result.success = false;
result.status = draftItem.status;
done();
});
}
else {
done();
}
});
}
});
}, function (err) {
if (err) {
logger.error(err);
res.send({success: false, message: errorMsg});
}
else {
var msg = cmd === 'publish' ? 'Page published successfully!' : 'Page saved successfully!';
//get the new status of the page
var status = null;
for(var i = 0; i < results.length; i++) {
if (results[i].itemId === pageId) {
status = results[i].status;
break;
}
}
res.send({success: true, message: msg, results: results, status: status});
}
});
}
}
else if (cmd === 'unpublish') {
api.content.unPublishContent(pageId, username, function(err, draftItem) {
var result = {
itemId: pageId,
fields: []
};
if (err)
result.success = false;
else if (draftItem) {
result.status = draftItem.status;
result.success = true;
}
else {
logger.error(new Error("designer-index.routeDesignerCommand - draftItem is null in callback."));
result.success = false;
}
var results = [];
results.push(result);
var msg = result.success === true ? "Page unpublished successfully!" : "Error unpublishing page!";
res.send({success: result.success, message: msg, results: results, status: result.status});
});
}
else {
var e = new Error("Invalid designer command: " + cmd);
logger.error(e);
res.send({success: false, message: e.message});
}
}
catch(e) {
logger.error(e);
res.send({success: false, message: errorMsg});
}
}
function ToolbarButton(text, command, url, icon, tooltip) {
var self = this;
self.text = text;
self.url = url || 'javascript:void(0);';
self.icon = icon;
self.command = command;
self.tooltip = tooltip;
}