'use strict';
var path = require('path'),
Errorie = require('errorie'),
fs = require('fs-extra'),
extend = require('utils-merge'),
numeral = require('numeral'),
diff = require('diff'),
prettysize = require('prettysize'),
stylietreeview = require('stylie.treeview'),
data_tables = require('./controller/data_tables'),
accountSchema = require('./model/account.js'),
AccountModel,
accountController,
authenticationRoutes,
accountAdminRouter,
adminExtSettings,
appenvironment,
settingJSON,
extJson,
// activate_middleware,
adminExtSettingsFile = path.join(process.cwd(), 'content/config/extensions/periodicjs.ext.asyncadmin/settings.json'),
defaultExtSettings = require('./controller/default_config');
/**
* An authentication extension that uses passport to authenticate user sessions.
* @{@link https://github.com/typesettin/periodicjs.ext.admin}
* @author Yaw Joseph Etse
* @copyright Copyright (c) 2014 Typesettin. All rights reserved.
* @license MIT
* @exports periodicjs.ext.admin
* @requires module:passport
* @param {object} periodic variable injection of resources from current periodic instance
*/
module.exports = function (periodic) {
// periodic = express,app,logger,config,db,mongoose
appenvironment = periodic.settings.application.environment;
settingJSON = fs.readJsonSync(adminExtSettingsFile);
adminExtSettings = (settingJSON[appenvironment]) ? extend(defaultExtSettings, settingJSON[appenvironment]) : defaultExtSettings;
if (adminExtSettings.use_separate_accounts) {
AccountModel = periodic.mongoose.model('Account', accountSchema);
}
try {
if (periodic.settings.theme) {
var themeinfo = fs.readJsonSync(path.join(periodic.settings.themepath, '/periodicjs.asyncadmin.json'), {
throws: false
});
if (themeinfo && themeinfo['periodicjs.ext.asyncadmin']) {
periodic.app.locals.themeasyncadmin = themeinfo['periodicjs.ext.asyncadmin'];
}
}
}
catch (e) {
periodic.logger.info('Current Theme does not use a custom cms interface', new Errorie({
name: 'Async Admin',
message: 'Config error - ' + e.message
}));
}
try {
// console.log('__dirname',__dirname);
extJson = fs.readJsonSync(path.join(__dirname, 'package.json'), {
throws: false
});
// console.log('extJson',extJson);
periodic.app.locals.asyncadminextJson = extJson;
}
catch (e) {
console.log(new Errorie({
name: 'Async Admin extJson',
message: 'Config error - ' + e.message
}));
}
periodic.app.locals.default_responsive_collapse = data_tables.default_responsive_collapse;
periodic.app.locals.default_responsive_expand = data_tables.default_responsive_expand;
periodic.app.locals.default_thead = data_tables.default_thead;
periodic.app.locals.default_custom_tfoot = data_tables.default_custom_tfoot;
periodic.app.locals.get_data_table_html = data_tables.get_data_table_html;
periodic.app.locals.cms_default_responsive_collapse = data_tables.cms_default_responsive_collapse;
periodic.app.locals.cms_default_tbody = data_tables.cms_default_tbody;
periodic.app.locals.numeral = numeral;
periodic.app.locals.diff = diff;
periodic.app.locals.use_separate_accounts = false;
periodic.app.locals.extend = extend;
periodic.app.locals.prettysize = prettysize;
periodic.app.locals.themename = periodic.settings.theme || 'Theme';
periodic.app.locals.appenvironment = appenvironment;
periodic.app.locals.session_ttl = periodic.settings.sessions.ttl_in_seconds;
periodic.app.locals.adminPath = adminExtSettings.settings.adminPath;
periodic.app.locals.adminLoginPath = adminExtSettings.adminLoginPath;
periodic.app.locals.socketIoPort = adminExtSettings.settings.socketIoPort;
periodic.app.locals.adminExtSettings = adminExtSettings;
periodic.app.locals.stylietreeview = stylietreeview;
periodic.app.controller.extension.asyncadmin = {
adminExtSettings: adminExtSettings,
};
periodic.app.controller.extension.asyncadmin = {
admin: require('./controller/admin')(periodic),
settings: require('./controller/admin_settings')(periodic),
userroles: require('./controller/admin_userroles')(periodic),
user: require('./controller/admin_user')(periodic),
socket_log: require('./controller/socket_log')(periodic),
socket_callback: require('./controller/server_callback')(periodic),
admin_extensions: require('./controller/admin_extensions')(periodic),
data_tables: data_tables,
search: {},
cmd: {}
};
periodic.app.controller.extension.asyncadmin.search.user = periodic.app.controller.extension.asyncadmin.admin.user_search;
periodic.app.controller.extension.asyncadmin.search.userrole = periodic.app.controller.extension.asyncadmin.admin.userrole_search;
periodic.app.controller.extension.asyncadmin.search.userprivilege = periodic.app.controller.extension.asyncadmin.admin.userprivilege_search;
periodic.app.controller.extension.asyncadmin.search.theme = periodic.app.controller.extension.asyncadmin.admin.themesearch;
periodic.app.controller.extension.asyncadmin.search.extension = periodic.app.controller.extension.asyncadmin.admin.extensionsearch;
periodic.app.controller.extension.asyncadmin.cmd.theme = periodic.app.controller.extension.asyncadmin.admin.themecmd;
periodic.app.controller.extension.asyncadmin.cmd.extension = periodic.app.controller.extension.asyncadmin.admin_extensions.extcmd;
//SET CUSTOM ADMIN
if (adminExtSettings.use_separate_accounts) {
periodic.app.controller.extension.login.loginExtSettings.settings = extend(
periodic.app.controller.extension.login.loginExtSettings.settings, adminExtSettings.login_settings.settings);
periodic.app.locals.use_separate_accounts = true;
periodic.app.controller.extension.asyncadmin.search.account = periodic.app.controller.extension.asyncadmin.admin.account_search;
}
var adminRouter = periodic.express.Router(),
userAdminRouter = periodic.express.Router(),
settingsAdminRouter = periodic.express.Router(),
extensionAdminRouter = periodic.express.Router(),
themeAdminRouter = periodic.express.Router(),
adminController = periodic.app.controller.extension.asyncadmin.admin,
adminSettingsController = periodic.app.controller.extension.asyncadmin.settings,
assetController = periodic.app.controller.native.asset,
authController = periodic.app.controller.extension.login.auth,
uacController = periodic.app.controller.extension.user_access_control.uac,
userroleController = periodic.app.controller.native.userrole,
userprivilegeController = periodic.app.controller.native.userprivilege,
userController = periodic.app.controller.native.user,
userAdminController = periodic.app.controller.extension.asyncadmin.user,
UACAdminController = periodic.app.controller.extension.asyncadmin.userroles,
mailController = periodic.app.controller.extension.mailer.mailer;
if (adminExtSettings.use_separate_accounts) {
accountAdminRouter = periodic.express.Router();
authController = require('../periodicjs.ext.login/controller/auth')(periodic, AccountModel);
periodic.app.controller.extension.asyncadmin.authController = authController;
// periodic.app.locals.depopulate = adminController.depopulate;
periodic.app.controller.native.account = periodic.core.controller.controller_routes(require('./model/account_controller_settings'));
authenticationRoutes = require('./routes/auth_router')(periodic);
periodic.app.controller.native.account.getUsersData = periodic.app.controller.native.account.getAccountsData;
accountController = periodic.app.controller.native.account;
uacController = require('../periodicjs.ext.user_access_control/controller/uac')(periodic, AccountModel, accountController); //periodic.app.controller.extension.user_access_control.uac
}
/**
* access control routes
*/
adminRouter.get('*', global.CoreCache.disableCache);
adminRouter.post('*', global.CoreCache.disableCache);
if (adminExtSettings.use_separate_accounts) {
adminRouter.all('*', adminController.ensureAccountUser, global.CoreCache.disableCache, authController.ensureAuthenticated, adminController.ensureAccountUser, uacController.loadUserRoles, uacController.check_user_access);
accountAdminRouter.all('*', global.CoreCache.disableCache, authController.ensureAuthenticated, uacController.loadUserRoles, uacController.check_user_access);
}
else {
adminRouter.all('*', global.CoreCache.disableCache, authController.ensureAuthenticated, uacController.loadUserRoles, uacController.check_user_access);
}
extensionAdminRouter.all('*', global.CoreCache.disableCache, authController.ensureAuthenticated, uacController.loadUserRoles, uacController.check_user_access);
themeAdminRouter.all('*', global.CoreCache.disableCache, authController.ensureAuthenticated, uacController.loadUserRoles, uacController.check_user_access);
userAdminRouter.all('*', global.CoreCache.disableCache, authController.ensureAuthenticated, uacController.loadUserRoles, uacController.check_user_access);
settingsAdminRouter.all('*', global.CoreCache.disableCache, authController.ensureAuthenticated, uacController.loadUserRoles, uacController.check_user_access);
/**
* admin routes
*/
// adminRouter.get('/', adminController.admin_index);
adminRouter.get('/', adminController.getHomepageStats, adminController.admin_index);
adminRouter.get('/dashboard', adminController.getHomepageStats, adminController.admin_index);
adminRouter.get('/extensions', adminController.loadExtensions, adminController.extensions_index);
adminRouter.get('/themes', adminController.loadThemes, adminSettingsController.load_theme_settings, adminController.themes_index);
// adminRouter.get('/users', userController.loadUsersWithCount, userController.loadUsersWithDefaultLimit, uacController.loadUacUsers, adminController.users_index);
// adminRouter.get('/check_periodic_version', adminController.check_periodic_version);
/**
* admin/user routes
*/
adminRouter.get('/users', userController.loadUsersWithCount, userController.loadUsersWithDefaultLimit, userController.loadUsers, userAdminController.users_index);
adminRouter.get('/content/users', userController.loadUsersWithCount, userController.loadUsersWithDefaultLimit, userController.loadUsers, userAdminController.users_index);
userAdminRouter.get('/search', userController.loadUsersWithCount, userController.loadUsersWithDefaultLimit, userController.loadUsers, userAdminController.users_index);
adminRouter.get('/content/user/new', userAdminController.users_new);
adminRouter.get('/user/new', userAdminController.users_new);
userAdminRouter.get('/:id', userController.loadUser, userAdminController.users_show);
userAdminRouter.get('/:id/edit', userController.loadUser, userAdminController.users_edit);
adminRouter.get('/content/user/:id/edit', userController.loadUser, userAdminController.users_edit);
adminRouter.get('/content/user/:id', userController.loadUser, userAdminController.users_edit);
userAdminRouter.post('/edit',
assetController.multiupload,
assetController.create_assets_from_files,
// periodic.core.controller.save_revision,
adminController.checkUserValidation,
// userController.loadUser,
adminController.fixCodeMirrorSubmit,
userController.update);
userAdminRouter.post('/new', assetController.upload, adminController.checkUserValidation, userController.create);
userAdminRouter.post('/:id/delete', assetController.upload, userController.loadUser, adminController.checkDeleteUser, userController.remove);
adminRouter.post('/users/:id/delete', assetController.upload, userController.loadUser, adminController.checkDeleteUser, userController.remove);
adminRouter.post('/content/user/:id/edit',
assetController.multiupload,
assetController.create_assets_from_files,
periodic.core.controller.save_revision,
// adminController.checkUserValidation,
userController.loadUser,
adminController.fixCodeMirrorSubmit,
adminController.removePasswordFromAdvancedSubmit,
userController.update);
adminRouter.get('/content/user/:id/revisions', adminController.skip_population, userController.loadUser, adminController.user_revisions);
adminRouter.post('/content/user/:id/revision/:revisionindex/delete', adminController.skip_population, userController.loadUser, adminController.revision_delete, adminController.removePasswordFromAdvancedSubmit, userController.update);
adminRouter.post('/content/user/:id/revision/:revisionindex/revert', adminController.skip_population, userController.loadUser, adminController.revision_revert, adminController.removePasswordFromAdvancedSubmit, userController.update);
if (adminExtSettings.use_separate_accounts) {
/**
* admin/account routes
*/
userAdminRouter.post('/:id/make_account', assetController.upload, userController.loadUser, adminController.convert_user_to_account, accountController.create);
adminRouter.get('/accounts', accountController.loadAccountsWithCount, accountController.loadAccountsWithDefaultLimit, accountController.loadAccounts, userAdminController.accounts_index);
adminRouter.get('/content/accounts', accountController.loadAccountsWithCount, accountController.loadAccountsWithDefaultLimit, accountController.loadAccounts, userAdminController.accounts_index);
accountAdminRouter.get('/search', accountController.loadAccountsWithCount, accountController.loadAccountsWithDefaultLimit, accountController.loadAccounts, userAdminController.accounts_index);
accountAdminRouter.get('/new', userAdminController.accounts_new);
adminRouter.get('/content/account/new', userAdminController.accounts_new);
accountAdminRouter.get('/:id', accountController.loadAccount, userAdminController.accounts_show);
accountAdminRouter.get('/:id/edit', accountController.loadAccount, userAdminController.accounts_edit);
adminRouter.get('/content/account/:id/edit', accountController.loadAccount, userAdminController.accounts_edit);
adminRouter.get('/content/account/:id', accountController.loadAccount, userAdminController.accounts_edit);
// console.log('accountController',accountController);
accountAdminRouter.post('/edit',
assetController.multiupload,
assetController.create_assets_from_files,
// periodic.core.controller.save_revision,
adminController.checkUserValidation,
// accountController.loadAccount,
adminController.fixCodeMirrorSubmit,
accountController.update);
accountAdminRouter.post('/new', assetController.upload, adminController.checkUserValidation, accountController.create);
accountAdminRouter.post('/:id/delete', assetController.upload, accountController.loadAccount, adminController.checkDeleteUser, accountController.remove);
adminRouter.post('/accounts/:id/delete', assetController.upload, accountController.loadAccount, adminController.checkDeleteUser, accountController.remove);
adminRouter.post('/content/account/:id/edit',
assetController.multiupload,
assetController.create_assets_from_files,
periodic.core.controller.save_revision,
// adminController.checkUserValidation,
accountController.loadAccount,
adminController.fixCodeMirrorSubmit,
adminController.removePasswordFromAdvancedSubmit,
accountController.update);
adminRouter.get('/content/account/:id/revisions', adminController.skip_population, accountController.loadAccount, adminController.account_revisions);
adminRouter.post('/content/account/:id/revision/:revisionindex/delete', adminController.skip_population, accountController.loadAccount, adminController.revision_delete, adminController.removePasswordFromAdvancedSubmit, accountController.update);
adminRouter.post('/content/account/:id/revision/:revisionindex/revert', adminController.skip_population, accountController.loadAccount, adminController.revision_revert, adminController.removePasswordFromAdvancedSubmit, accountController.update);
adminRouter.use('/account', accountAdminRouter);
}
//user roles
adminRouter.get('/userroles',
userroleController.loadUserrolesWithCount,
userroleController.loadUserrolesWithDefaultLimit,
userroleController.loadUserroles,
UACAdminController.index);
adminRouter.get('/content/userroles',
userroleController.loadUserrolesWithCount,
userroleController.loadUserrolesWithDefaultLimit,
userroleController.loadUserroles,
UACAdminController.index);
adminRouter.get('/userrole/new', UACAdminController.userrole_new);
adminRouter.get('/userrole/:id/edit',
userprivilegeController.loadUserprivileges,
userroleController.loadUserrole,
UACAdminController.show);
adminRouter.get('/content/userrole/:id',
userprivilegeController.loadUserprivileges,
userroleController.loadUserrole,
UACAdminController.show);
adminRouter.get('/userrole/edit/:id',
userprivilegeController.loadUserprivileges,
userroleController.loadUserrole,
UACAdminController.show);
adminRouter.post('/userrole/new/:id',
uacController.skipInvalid,
userroleController.loadUserrole,
UACAdminController.getRoleIdCount,
userroleController.create); //new from tag list
adminRouter.post('/userrole/new',
userroleController.create); //new from modal
adminRouter.post('/content/userrole/new',
userroleController.create); //new from modal
adminRouter.post('/userrole/edit',
userroleController.update);
adminRouter.post('/userrole/:id/delete', userroleController.loadUserrole,
userroleController.remove);
// user privileges
adminRouter.get('/userprivileges',
userprivilegeController.loadUserprivilegesWithCount,
userprivilegeController.loadUserprivilegesWithDefaultLimit,
userprivilegeController.loadUserprivileges,
UACAdminController.userprivilege_index);
adminRouter.get('/content/userprivileges',
userprivilegeController.loadUserprivilegesWithCount,
userprivilegeController.loadUserprivilegesWithDefaultLimit,
userprivilegeController.loadUserprivileges,
UACAdminController.userprivilege_index);
adminRouter.post('/userprivilege/new/:id',
uacController.skipInvalid,
userprivilegeController.loadUserprivilege,
UACAdminController.getPrivilegeIdCount,
userprivilegeController.create); //new from tag list
adminRouter.post('/userprivilege/new',
userprivilegeController.create); //new from modal
adminRouter.post('/content/userprivilege/new',
userprivilegeController.create); //new from modal
adminRouter.get('/userprivilege/:id/edit',
userprivilegeController.loadUserprivileges,
userprivilegeController.loadUserprivilege,
UACAdminController.userprivilege_show);
adminRouter.get('/content/userprivilege/:id',
userprivilegeController.loadUserprivileges,
userprivilegeController.loadUserprivilege,
UACAdminController.userprivilege_show);
adminRouter.get('/content/userprivilege/:id',
userprivilegeController.loadUserprivileges,
userprivilegeController.loadUserprivilege,
UACAdminController.userprivilege_show);
adminRouter.post('/userprivilege/edit',
userprivilegeController.update);
//
/**
* admin/settings routes
*/
settingsAdminRouter.get('/', adminSettingsController.load_app_settings, adminSettingsController.load_theme_settings, adminController.settings_index);
// settingsAdminRouter.get('/faq', adminController.settings_faq);
settingsAdminRouter.post('/restart', adminSettingsController.restart_app);
settingsAdminRouter.post('/updateapp', adminSettingsController.update_app);
settingsAdminRouter.post('/updateappsettings', adminSettingsController.update_app_settings);
settingsAdminRouter.post('/updatethemesettings', adminSettingsController.update_theme_settings);
settingsAdminRouter.post('/updateextfiledata', adminSettingsController.update_ext_filedata);
settingsAdminRouter.post('/themefiledata', adminSettingsController.update_theme_filedata);
settingsAdminRouter.post('/updateconfigjson', adminSettingsController.update_config_json_files);
//user priviliges
adminRouter.get('/userprivileges/search.:ext', global.CoreCache.disableCache, uacController.loadUserprivileges, uacController.userprivilegeSearchResults);
adminRouter.get('/userprivileges/search', global.CoreCache.disableCache, uacController.loadUserprivileges, uacController.userprivilegeSearchResults);
//searching
periodic.app.get('/' + periodic.app.locals.adminPath + '/content/search', adminController.admin_search);
periodic.app.get('/healthcheck', adminController.healthcheck);
//mail settings
periodic.app.get('/' + periodic.app.locals.adminPath + '/mailer/test', mailController.testemail);
periodic.app.post('/' + periodic.app.locals.adminPath + '/mailer/sendmail', mailController.sendmail);
periodic.app.get('/replietest', periodic.app.controller.extension.asyncadmin.socket_log.get_replie_stats);
periodic.app.get('/p-secure/asset/:id/:filename', assetController.loadAsset, assetController.decryptAsset);
adminRouter.use('/extension', extensionAdminRouter);
adminRouter.use('/theme', themeAdminRouter);
adminRouter.use('/user', userAdminRouter);
adminRouter.use('/settings', settingsAdminRouter);
if (adminExtSettings.use_separate_accounts) {
periodic.app.use('/' + periodic.app.locals.adminLoginPath, authenticationRoutes);
}
periodic.app.use('/' + periodic.app.locals.adminPath, adminRouter);
return periodic;
};