oils-plugin-braziw-cms
Version:
Content and document management system plugin for oils js
243 lines (183 loc) • 6.88 kB
JavaScript
module.exports = async function(pluginConf, web) {
let pjson = require(web.conf.baseDir + '/package.json');
let self = this;
web.cms = self;
//backwards
web.dms = web.cms;
web.cms.adminMenu = [];
pluginConf = web.utils.extend(require('./conf/conf.js')(pluginConf), pluginConf);
web.cms.conf = pluginConf;
let context = pluginConf.context;
var routes = {};
let DmsUtils = require('./utils/DmsUtils');
web.cms.utils = new DmsUtils(pluginConf, web);
web.dmsUtils = web.cms.utils;
web.cms.constants = {};
web.cms.constants.file = 'file';
web.cms.constants.folder = 'folder';
web.cms.getCmsModel = function(docType) {
if (web.modelCache[docType]) {
return web.modelCache[docType];
}
return web.includeModel(web.cms.conf.models[docType]);
};
web.cms.registerCmsModel = function(modelName, path) {
if (!web.cms.conf.models[modelName]) {
web.cms.conf.models[modelName] = path;
}
};
web.cms.getCmsModels = function() {
let myModels = [];
for (let i in web.cms.conf.models) {
myModels.push(web.cms.getCmsModel(i));
}
return myModels;
};
web.cms.getDocTypeMap = function() {
let myModels = web.cms.getCmsModels();
let docTypeMap = {};
for (let i in myModels) {
let modelDict = myModels[i].getModelDictionary();
if (modelDict.name != 'Document') {
let label = modelDict.label || modelDict.name;
docTypeMap[modelDict.name] = label;
}
}
return docTypeMap;
};
if (pluginConf.defaultMenu) {
web.cms.adminMenu = pluginConf.defaultMenu;
} else {
web.cms.adminMenu = [
{items:[{text:'Dashboard', link:context}]},
{items:[{text:'DMS', link:context + '/document/list'}]}
];
}
if (web.auth && pluginConf.accessRole) {
routes['/^' + context + '*/'] = {
isRegexp: true,
all: function(req, res, next) {
web.auth.loginUtils.handleRole(pluginConf.accessRole, req, res, next);
}
};
}
web.on('beforeRender', function(view, options) {
let cmsObj = {
adminMenu: web.cms.adminMenu,
conf: web.cms.conf,
}
options._cms = cmsObj;
});
routes[context] = web.include(pluginConf.contextController);
routes[context + '/dashboard'] = require('./controllers/admin/dashboard.js')(pluginConf, web);
routes[context + '/document/list'] = require('./controllers/document/list.js')(pluginConf, web);
//routes[context + '/document/add/:DOC_TYPE'] = require('./controllers/document/add.js')(pkg, web);
routes[context + '/document/add'] = require('./controllers/document/add.js')(pluginConf, web);
routes[context + '/document/edit/:FILE_ID'] = require('./controllers/document/add.js')(pluginConf, web);
routes[context + '/document/delete/:DOC_ID'] = require('./controllers/document/delete.js')(pluginConf, web);
routes[context + '/site-settings'] = require('./controllers/admin/site-settings.js')(pluginConf, web);
routes[context + '/document/upload'] = require('./controllers/document/upload.js');
routes[context + '/document/download'] = require('./controllers/document/download.js');
routes['/plugin/cms/codemirror/codemirror.min.css'] = {
get: function(req, res) {
web.utils.serveStaticFile(pluginConf.pluginPath + '/static/codemirror/codemirror.min.css', res);
}
};
routes['/plugin/cms/codemirror/codemirror.min.js'] = {
get: function(req, res) {
web.utils.serveStaticFile(pluginConf.pluginPath + '/static/codemirror/codemirror.min.js', res);
}
};
routes['/css/plugin/cms/admin.css'] = {
get: function(req, res) {
web.utils.serveStaticFile(pluginConf.pluginPath + '/static/admin.css', res);
}
};
routes['/css/plugin/cms/dms.css'] = {
get: function(req, res) {
web.utils.serveStaticFile(pluginConf.pluginPath + '/static/dms.css', res);
}
};
routes['/js/plugin/cms/list-dropzone.js'] = {
get: function(req, res) {
web.utils.serveStaticFile(pluginConf.pluginPath + '/static/list-dropzone.js', res);
}
};
web.addRoutes(routes);
await web.cms.utils.initDocRoutes();
const SiteSetting = web.cms.getCmsModel('SiteSetting');
let updateSiteSettingCache = function(options) {
SiteSetting.findOne({docType:'SiteSetting'}).lean().exec(function(err,siteSetting) {
web.cms.siteSettingCache = web.cms.siteSettingCache || {
title: pluginConf.defaultSiteTitle
};
if (siteSetting) {
siteSetting.version = siteSetting.version || web.conf.siteVersion || pjson.version;
web.cms.siteSettingCache = siteSetting;
if (options) {
options._site = web.cms.siteSetting;
}
console.log('Site setting cache updated: ' + JSON.stringify(siteSetting));
}
});
};
web.cms.updateSiteSettingCache = updateSiteSettingCache;
updateSiteSettingCache();
web.on('beforeRender', function(view, options) {
let site = web.cms.siteSettingCache || {};
options._site = site;
});
web.on('initServer', async function() {
if (!web.syspars) {
throw new Error('CMS needs oils-plugin-syspars plugin');
}
let Document = web.includeModel(pluginConf.models.Document);
await web.runOnce('CMS_RUN_ONCE', async function() {
await cmsRunOnce();
})
});
async function cmsRunOnce() {
if (web.auth && pluginConf.autoCreateAdminUser) {
let User = web.auth.UserModel;
let saveAdminUser = function() {
//deprecated, auth plugin now handles admin registration for new websites
if (!pluginConf.defaultAdminPassword) {
throw new Error("cms-pluginConf.defaultAdminPassword is required");
}
let user = new User();
user.username = 'admin';
user.password = pluginConf.defaultAdminPassword;
user.birthday = new Date();
user.role = 'ADMIN';
user.fullname = 'Admin';
user.nickname = 'Admin';
user.email = 'admin@example.com';
user.save(function(err) {
if (err) throw err;
});
console.log('Admin user saved.');
};
console.log('First time to run. Running DMS init data.');
//init-data
User.findOne({username:'admin'}, function(err, user) {
if (!user) {
saveAdminUser();
} else if (user.role != 'ADMIN') {
user.remove(function() {
saveAdminUser();
});
}
});
}
SiteSetting.findOne({docType:'SiteSetting'}, function(err, siteSetting) {
if (!siteSetting) {
siteSetting = new SiteSetting();
siteSetting.title = pluginConf.defaultSiteTitle;
siteSetting.save(function(err) {
if (err) throw err;
web.cms.updateSiteSettingCache();
});
}
});
}
};