UNPKG

periodicjs.ext.reactapp

Version:
288 lines (278 loc) 13.5 kB
'use strict'; const periodic = require('periodicjs'); const Promisie = require('promisie'); // const utility = require('../utilities/index'); const utilities = require('../utilities'); const UAParser = require('ua-parser-js'); // console.log({ getParameterized }); // let components = utilities.controllerhelper.components; const appSettings = periodic.settings; // console.log('periodic', periodic); appSettings.theme = periodic.settings.container.name; appSettings.themename = periodic.settings.container.name; const extsettings = utilities.reactapp().settings; const versions = utilities.controllerhelper.versions; // const themeSettings = periodic.settings.themeSettings; // const appenvironment = appSettings.application.environment; // const CoreController = periodic.core.controller; // const CoreUtilities = periodic.core.utilities; const logger = periodic.logger; /** * index page for react admin, that serves admin app * @param {object} req express request * @param {object} res express reponse * @return {null} does not return a value */ function admin_index(req, res, next) { if (req.query.format !== 'json' && req.query.format !== 'json&') { let viewname = 'admin/index'; if (req.headers && req.headers['user-agent']) { const UserAgentParser = new UAParser(); UserAgentParser.setUA(req.headers['user-agent']); const parseUserAgent = UserAgentParser.getResult(); if (parseUserAgent.browser.name === 'Chrome' && parseInt(parseUserAgent.browser.version, 10) < 40) { viewname = 'admin/support'; } else if (parseUserAgent.browser.name === 'IE' && parseInt(parseUserAgent.browser.version, 10) < 11) { viewname = 'admin/support'; } else if (parseUserAgent.browser.name === 'Firefox' && parseInt(parseUserAgent.browser.version, 10) < 41) { viewname = 'admin/support'; } else if (parseUserAgent.browser.name === 'Android Browser' && parseInt(parseUserAgent.browser.version, 10) < 5) { viewname = 'admin/support'; } if (parseUserAgent.browser.name === 'IE') { res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate'); } } // UserAgentParser.setUA(uastring); // logger.silly('render reactapp, ssr', extsettings.server_side_react); // logger.silly('render reactapp, req.query.format',req.query.format); let viewtemplate = { viewname, extname: 'periodicjs.ext.reactapp', }; let viewdata = { pagedata: { // title: 'React Admin', // toplink: '&raquo; Multi-Factor Authenticator', }, user: req.user, reactapp: utilities.reactapp(), theme_name: appSettings.themename, // adminPostRoute: adminPostRoute }; if (extsettings.server_side_react) { return utilities.controllerhelper.pullConfigurationSettings(false) .then(() => { // logger.silly('req._parsedOriginalUrl.pathname', req._parsedOriginalUrl.pathname); // logger.silly({ unauthenticatedManifestSettings }); if (utilities.controllerhelper.unauthenticatedManifestSettings && utilities.controllerhelper.unauthenticatedManifestSettings.containers && Object.keys(utilities.controllerhelper.unauthenticatedManifestSettings.containers).length) { let layoutPath = utilities.settings.findMatchingRoute(utilities.controllerhelper.unauthenticatedManifestSettings.containers, req._parsedOriginalUrl.pathname); let manifest = (layoutPath) ? utilities.controllerhelper.unauthenticatedManifestSettings.containers[layoutPath] : false; // console.log({ layoutPath, manifest }); return utilities.ssr_manifest({ layoutPath, manifest, req_url: req._parsedOriginalUrl.pathname, basename: extsettings.basename, }); } else { return Promise.resolve({}, {}); } }) .then((results) => { let { body, pagedata, } = results; // console.log({ body, pagedata }); viewdata = Object.assign({}, viewdata, { body, }, { pagedata, }); periodic.core.controller.render(req, res, viewtemplate, viewdata); }) .catch(next); } else { periodic.core.controller.render(req, res, viewtemplate, viewdata); } } else { // console.log('SKIPPING reactapp req._parsedOriginalUrl.pathname', req._parsedOriginalUrl.pathname); // console.log('SKIPPING reactapp: req._parsedOriginalUrl.pathname.indexOf(/extensiondata/) === -1', req._parsedOriginalUrl.pathname.indexOf('/extensiondata/') === -1); // console.log('SKIPPING reactapp req.query.format !== json',req.query.format !== 'json'); // console.log('SKIPPING reactapp req.query.format !== json&',req.query.format !== 'json&'); next(); } } /** * Loads manifest configuration data and sends response with settings * @param {Object} req express request * @param {Object} res express reponse * @param {Function} next express next function */ function loadManifest(req, res, next) { return utilities.controllerhelper.pullConfigurationSettings((req.query && req.query.refresh) ? 'manifest' : false) .then(() => { let manifest = Object.assign({}, utilities.controllerhelper.manifestSettings); if (req.query && req.query.refresh_log && req.query.refresh_log !== 'false') { logger.silly('reloaded manifest', { manifest, }); } if (extsettings && extsettings.includeCoreData && extsettings.includeCoreData.manifest) { utilities.controllerhelper.setCoreDataConfigurations(); if (utilities.controllerhelper.CORE_DATA_CONFIGURATIONS.manifest) manifest.containers = Object.assign({}, utilities.controllerhelper.CORE_DATA_CONFIGURATIONS.manifest, manifest.containers); } if (req.query && req.query.initial) manifest.containers = utilities.controllerhelper.filterInitialManifest(manifest.containers, req.query.location); manifest.containers = utilities.controllerhelper.recursivePrivilegesFilter(Object.keys( (req.session && req.session.userprivilegesdata)? req.session.userprivilegesdata : {} ), manifest.containers, true); if (res && typeof res.send === 'function') { res.status(200).send({ result: 'success', status: 200, data: { versions: (req.query && req.query.initial) ? undefined : utilities.controllerhelper.versions, settings: manifest, }, }); } else return manifest; }) .catch(e => (typeof next === 'function') ? next(e) : Promisie.reject(e)); } /** * Loads unauthenticated manifest configuration data and sends response with settings * @param {Object} req express request * @param {Object} res express reponse * @param {Function} next express next function */ function loadUnauthenticatedManifest(req, res, next) { return utilities.controllerhelper.pullConfigurationSettings((req.query && req.query.refresh) ? 'unauthenticated' : false) .then(() => { let unauthenticated_manifest = Object.assign({}, utilities.controllerhelper.unauthenticatedManifestSettings); // console.log({ unauthenticated_manifest }); if (req.query && req.query.refresh_log && req.query.refresh_log !== 'false') { logger.silly('reloaded unauthenticated manifest', { unauthenticated_manifest, }); } if (extsettings && extsettings.includeCoreData && extsettings.includeCoreData.unauthenticated_manifest) { utilities.controllerhelper.setCoreDataConfigurations(); if (utilities.controllerhelper.CORE_DATA_CONFIGURATIONS.unauthenticated_manifest) unauthenticated_manifest.containers = Object.assign({}, utilities.controllerhelper.CORE_DATA_CONFIGURATIONS.unauthenticated_manifest, unauthenticated_manifest.containers); } if (req.query && req.query.initial) unauthenticated_manifest.containers = utilities.controllerhelper.filterInitialManifest(unauthenticated_manifest.containers, req.query.location); if (res && typeof res.send === 'function') { res.status(200).send({ result: 'success', status: 200, data: { versions: (req.query && req.query.initial) ? undefined : utilities.controllerhelper.versions, settings: unauthenticated_manifest, }, }); } else return unauthenticated_manifest; }) .catch(e => (typeof next === 'function') ? next(e) : Promisie.reject(e)); } /** * Loads component configuration data and sends response with settings * @param {object} req express request * @param {object} res express reponse * @param {Function} next express next function */ function loadComponent(req, res, next) { utilities.controllerhelper.pullComponentSettings((req.query && req.query.refresh) ? req.params.component : false) .then(() => { let component = utilities.controllerhelper.components[req.params.component] || { status: 'undefined', }; if (req.query && req.query.refresh_log && req.query.refresh_log !== 'false') logger.silly(`reloaded component ${ req.params.component }`, { component, }); res.status(200).send({ result: 'success', status: 200, data: { versions, settings: utilities.controllerhelper.assignComponentStatus(component), }, }); }) .catch(next); } /** * Loads user preference data and sends response with settings * @param {object} req express request * @param {object} res express reponse */ function loadUserPreferences(req, res) { if (res && typeof res.send === 'function') { res.status(200).send({ result: 'success', status: 200, data: { versions, settings: (req.user && req.user.extensionattributes && req.user.extensionattributes.preferences) ? req.user.extensionattributes.preferences : {}, }, }); } else return (req.user && req.user.extensionattributes && req.user.extensionattributes.preferences) ? req.user.extensionattributes.preferences : {}; } /** * Loads navigation configuration data and sends response with settings * @param {object} req express request * @param {object} res express reponse * @param {Function} next express next function */ function loadNavigation(req, res, next) { return utilities.controllerhelper.pullConfigurationSettings((req.query && req.query.refresh) ? 'navigation' : false) .then(() => { let navigation = Object.assign({}, utilities.controllerhelper.navigationSettings); if (req.query && req.query.refresh_log && req.query.refresh_log !== 'false') { logger.silly('reloaded navigation', { navigation, }); } if (extsettings && extsettings.includeCoreData && extsettings.includeCoreData.navigation) { utilities.controllerhelper.setCoreDataConfigurations(); if (utilities.controllerhelper.CORE_DATA_CONFIGURATIONS.navigation && utilities.controllerhelper.CORE_DATA_CONFIGURATIONS.navigation.layout) { navigation.layout = Object.assign({}, navigation.layout); navigation.layout.children = Object.assign([], navigation.layout.children); navigation.layout.children = navigation.layout.children.concat(utilities.controllerhelper.CORE_DATA_CONFIGURATIONS.navigation.layout.children || []); } } navigation.wrapper = extsettings.navigationLayout.wrapper; navigation.container = extsettings.navigationLayout.container; // console.log({ navigation }, 'req.session.userprivilegesdata', req.session.userprivilegesdata); navigation.layout = utilities.controllerhelper.recursivePrivilegesFilter(Object.keys((req.session && req.session.userprivilegesdata)? req.session.userprivilegesdata : {}), [navigation.layout, ])[0]; if (res && typeof res.send === 'function') { res.status(200).send({ result: 'success', status: 200, data: { versions, settings: navigation, }, }); } else return navigation; }) .catch(e => (typeof next === 'function') ? next(e) : Promisie.reject(e)); } function loadConfigurations(req, res) { // console.log('loading configs'); return utilities.controllerhelper.pullConfigurationSettings((req.query && req.query.refresh) ? true : false) .then(() => { if (req.query) delete req.query.refresh; return Promisie.parallel({ navigation: loadNavigation.bind(null, req), manifest: loadManifest.bind(null, req), unauthenticated_manifest: loadUnauthenticatedManifest.bind(null, req), preferences: loadUserPreferences.bind(null, req), }); }) .then(settings => { res.status(200).send({ result: 'success', status: 200, data: { settings, versions, }, }); }) .catch(e => { logger.error(e); res.status(500).send({ result: 'error', status: 500, data: { error: e.message, }, }); }); } module.exports = { index: admin_index, loadManifest, loadComponent, loadUserPreferences, loadNavigation, loadConfigurations, loadUnauthenticatedManifest, };