UNPKG

sheercms

Version:

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

202 lines (188 loc) 5.65 kB
var logger = require('../logger'); var models = require('./menus-models'); var api = require('../api'); var mongoose = require('mongoose'); var S = require('string'); var util = require('../utilities'); /* callback: (err, menu) */ module.exports.saveMenu = function(menu, callback) { try { if (menu._id) { //existing menu var id = util.toObjectId(menu._id); models.Menu.findById(id, function (err, result) { try { if (err) { logger.error(err); if (callback) callback(err); } else if (result === null) { var e = new Error("Menu not found: " + menu._id); logger.error(e); if (callback) callback(e); } else { //update the properties result.name = menu.name; result.modified = new Date(); result.items = menu.items; result.itemCount = getItemCount(menu); result.templateId = util.toObjectId(menu.templateId); result.markModified('items'); result.save(function (err) { if (err) { logger.error(err); if (callback) callback(err); } else { logger.info("Menu updated: " + result._id); if (callback) callback(null, mapMenu(result)); } }); } } catch(e) { logger.error(e); if (callback) callback(e); } }); } else { //new menu var result = new models.Menu({ name: menu.name, created: new Date(), items: menu.items, itemCount: getItemCount(menu.items) }); result.save(function (err) { if (err) { logger.error(err); if (callback) callback(err); } else { logger.info("Menu created: " + result._id); if (callback) callback(null, mapMenu(result)); } }); } } catch(e) { logger.error(e); if (callback) callback(e); } }; /* arg can be an ObjectId, id string, or object with these properties: name, id callback: (err, menu) */ module.exports.getMenu = function(arg, callback) { try { var a; if (typeof arg == 'string') a = { id: util.toObjectId(arg) }; else if (arg.id || arg.name) a = arg; else a = { id: arg }; if (a.id) { models.Menu.findOne({_id: a.id}).lean().exec(function (err, result) { if (err) { logger.error(err); if (callback) callback(err); } else { if (callback) callback(null, result); } }); } else if (a.name) { models.Menu.findOne({name: a.name}).lean().exec(function (err, result) { if (err) { logger.error(err); if (callback) callback(err); } else { if (callback) callback(null, result); } }); } else { var e = new Error('Invalid menu id: ' + arg); logger.error(e); if (callback) callback(e); } } catch(e) { logger.error(e); if (callback) callback(e); } }; /* callback: (err, menus) */ module.exports.getMenus = function(callback) { if (callback) { models.Menu.find().select("name itemCount created modified templateId").sort("name").lean().exec(function (err, result) { callback(err, result); }); } }; /* callback: (err) */ module.exports.deleteMenu = function(id, callback) { try { var mId = util.toObjectId(id); if (mId) { models.Menu.findByIdAndRemove(mId, function (err) { if (err) { logger.error(err); if (callback) callback(err); } else { if (callback) callback(null); } }); } else { var e = new Error('Invalid menu id: ' + id); logger.error(e); if (callback) callback(e); } } catch(e) { logger.error(e); if (callback) callback(e); } }; function getItemCount(menu) { if (menu && menu.items) { return countItems(menu.items); } else return 0; } //recursive function countItems(items) { var count = 0; for(var i = 0; i < items.length; i++) { var a = items[i]; count++; if (a.items) count += countItems(a.items); } return count; } function mapMenu(menu) { return { id: menu._id.toString(), _id: menu._id.toString(), name: menu.name, created: menu.created, modified: menu.modified, items: menu.items, itemCount: menu.itemCount, templateId: menu.templateId }; }