UNPKG

reldens

Version:
144 lines (135 loc) 6.19 kB
/** * * Reldens - CreateAdminSubscriber * * Subscriber that handles the creation and initialization of the admin panel. * Configures entities, templates, authentication, and branding for the administration interface. * */ const { AdminManager } = require('@reldens/cms/lib/admin-manager'); const { AdminManagerValidator } = require('@reldens/cms/lib/admin-manager-validator'); const { AdminEntitiesGenerator } = require('@reldens/cms/lib/admin-entities-generator'); const { AdminTemplatesLoader } = require('@reldens/cms/lib/admin-templates-loader'); const { AdminDistHelper } = require('@reldens/cms/lib/admin-dist-helper'); const { DefaultTranslations } = require('@reldens/cms/lib/admin-manager/default-translations'); const { MimeTypes } = require('../../../game/mime-types'); const { GameConst } = require('../../../game/constants'); const { FileHandler } = require('@reldens/server-utils'); const { Logger, EnvVar, sc } = require('@reldens/utils'); /** * @typedef {import('../../../game/server/manager').ServerManager} ServerManager * @typedef {import('../../../game/server/theme-manager').ThemeManager} ThemeManager * @typedef {import('../../../config/server/manager').ConfigManager} ConfigManager */ class CreateAdminSubscriber { /** * @param {Object} event * @returns {Promise<boolean|void>} */ async activateAdmin(event) { let serverManager = sc.get(event, 'serverManager', false); if(!this.validate(serverManager)){ return false; } let entitiesGenerator = new AdminEntitiesGenerator(); serverManager.events.emit('reldens.beforeCreateAdminManager', {serverManager}); let dataServerConfig = serverManager.dataServerConfig; let dataServer = serverManager.dataServer; let themeManager = serverManager.themeManager; let adminConfig = { events: serverManager.events, dataServer, authenticationCallback: serverManager.loginManager.roleAuthenticationCallback.bind( serverManager.loginManager ), app: serverManager.app, appServerFactory: serverManager.appServerFactory, entities: entitiesGenerator.generate(dataServerConfig.loadedEntities, dataServer.entityManager.entities), validator: new AdminManagerValidator(), autoSyncDistCallback: AdminDistHelper.copyBucketFilesToDist, updateAdminAssetsDistOnActivation: themeManager.copyAdminAssetsToDist.bind(themeManager), renderCallback: themeManager.templateEngine.render.bind(themeManager.templateEngine), secret: EnvVar.nonEmptyString(process.env, 'RELDENS_ADMIN_SECRET', ''), rootPath: EnvVar.nonEmptyString(process.env, 'RELDENS_ADMIN_ROUTE_PATH', '/reldens-admin'), translations: Object.assign({}, DefaultTranslations, dataServerConfig?.translations || {}), adminFilesContents: await AdminTemplatesLoader.fetchAdminFilesContents(themeManager.adminTemplates), mimeTypes: MimeTypes, allowedExtensions: { audio: ['.aac', '.mid', '.midi', '.mp3', '.ogg', '.oga', '.opus', '.wav', '.weba', '.3g2'], image: ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp'], text: ['.json', '.jsonld', '.txt'] }, ...sc.deepMergeProperties( this.fetchConfigurations(serverManager.configManager), await this.fetchFilesContents(themeManager) ) }; serverManager.serverAdmin = new AdminManager(adminConfig); serverManager.events.emit('reldens.beforeSetupAdminManager', {serverManager}); await serverManager.serverAdmin.setupAdmin(); serverManager.events.emit('reldens.afterCreateAdminManager', {serverManager}); } /** * @param {ServerManager|false} serverManager * @returns {boolean} */ validate(serverManager) { if(!serverManager){ Logger.error('ServerManager not found in CreateAdminSubscriber.'); return false; } if(!serverManager.events){ Logger.error('EventsManager not found in CreateAdminSubscriber.'); return false; } if(!serverManager.themeManager){ Logger.error('ThemeManager not found in CreateAdminSubscriber.'); return false; } if(!serverManager.configManager){ Logger.error('ConfigManager not found in CreateAdminSubscriber.'); return false; } return true; } /** * @param {ConfigManager} config * @returns {Object} */ fetchConfigurations(config) { let path = 'server/admin/'; return { adminRoleId: config.get(path+'roleId', 1), stylesFilePath: config.getWithoutLogs(path+'stylesPath', '/css/'+GameConst.STRUCTURE.ADMIN_CSS_FILE), scriptsFilePath: config.getWithoutLogs(path+'scriptsPath', '/'+GameConst.STRUCTURE.ADMIN_JS_FILE), branding: { companyName: config.getWithoutLogs(path+'companyName', 'Reldens - Administration Panel'), logo: config.getWithoutLogs(path+'logoPath', '/assets/web/reldens-your-logo-mage.png'), favicon: config.getWithoutLogs(path+'faviconPath', '/assets/web/favicon.ico'), copyRight: config.getWithoutLogs(path+'copyRight', '') } }; } /** * @param {ThemeManager} themeManager * @returns {Promise<Object>} */ async fetchFilesContents(themeManager) { return { branding: { copyRight: await FileHandler.fetchFileContents( FileHandler.joinPaths( themeManager.projectAdminTemplatesPath, themeManager.adminTemplatesList.defaultCopyRight ) ) } } } } module.exports.CreateAdminSubscriber = CreateAdminSubscriber;