UNPKG

sheercms

Version:

Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.

256 lines (225 loc) 10.7 kB
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; }