sheercms
Version:
Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.
202 lines (188 loc) • 5.65 kB
JavaScript
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
};
}