UNPKG

jsharmony-cms

Version:
126 lines (98 loc) 4.1 kB
//(routetype, req, res, callback, require, jsh, modelid, params) var _ = require('lodash'); var Helper = require('../Helper.js'); var cms = jsh.Modules['jsHarmonyCMS']; var async = require('async'); var dbtypes = jsh.AppSrv.DB.types; if(routetype != 'model') return callback(); var model = jsh.getModelClone(req, modelid); if (!Helper.hasModelAction(req, model, 'B')) return callback(); var missing_menus = []; var required_menus = []; var existing_menus = {}; var site_config = {}; var site_id = null; var branch_id = null; async.waterfall([ //Get site_id function(menu_cb){ jsh.AppSrv.ExecRecordset(req._DBContext, 'select {schema}.my_current_branch_id() branch_id,{schema}.my_current_site_id() site_id', [], { }, function (err, rslt) { if(err) callback(); if(!rslt || !rslt.length || !rslt[0] || !rslt[0].length) return callback(); site_id = rslt[0][0].site_id; //If no site is checked out, do not check menu config if(!site_id) return callback(); branch_id = rslt[0][0].branch_id; //If no branch is checked out, do not check menu config if(!branch_id) return callback(); return menu_cb(); }); }, function(menu_cb){ async.parallel([ //Get site config function(template_cb){ cms.funcs.getSiteConfig(req._DBContext, site_id, { continueOnConfigError: true }, function(err, siteConfig){ if(err) return template_cb(err); site_config = siteConfig; return template_cb(); }); }, //Get menus in current revision function(template_cb){ jsh.AppSrv.ExecRecordset(req._DBContext, 'select menu_tag from {schema}.v_my_menu', [], { }, function (err, rslt) { if(err) template_cb(); if(!rslt || !rslt.length || !rslt[0] || !rslt[0].length) return template_cb(); _.each(rslt[0], function(menu){ existing_menus[menu.menu_tag] = menu; }); return template_cb(); }); }, ], function(err){ return menu_cb(err); }); }, //Find missing menus function(menu_cb){ required_menus = ((site_config || {}).menus||[]); _.each(required_menus, function(required_menu){ if(required_menu && required_menu.tag){ if(!(required_menu.tag in existing_menus)){ missing_menus.push(_.pick(required_menu,['name','tag'])); } } }); return menu_cb(); }, //Add missing menus, if querstring add_missing_menus parameter is set function(menu_cb){ if(!missing_menus.length || !req.query || !req.query.add_missing_menus) return menu_cb(); async.eachSeries(missing_menus, function(missing_menu, missing_menu_cb){ if(!missing_menu.tag) { var errmsg = 'Site Menu missing tag: '+JSON.stringify(missing_menu); jsh.Log.error(errmsg); res.end(errmsg); return; } var menu_name = missing_menu.name || missing_menu.tag; var menu_tag = missing_menu.tag; jsh.AppSrv.ExecCommand(req._DBContext, 'insert into {schema}.v_my_menu(menu_name, menu_tag) values(@menu_name, @menu_tag)', [dbtypes.NVarChar(256),dbtypes.NVarChar(256)], { menu_name: menu_name, menu_tag: menu_tag }, function (err, rslt) { if(err) { jsh.Log.error(err); Helper.GenError(req, res, -99999, 'An unexpected error has occurred'); return; } return missing_menu_cb(); } ); }, function(err){ if (err) { jsh.Log.error(err); Helper.GenError(req, res, -99999, 'An unexpected error has occurred'); return; } res.end('***JSHARMONY_REDIRECT***\n'+req.baseurl+modelid+'?tstmp='+(new Date()).getTime()); }); }, //Return missing menus to client function(menu_cb){ model.oninit = '_this.missing_menus = '+JSON.stringify(missing_menus)+';'+model.oninit||''; return menu_cb(); }, ], function(err){ //Save model to local request cache req.jshlocal.Models[modelid] = model; return callback(); });