UNPKG

periodicjs

Version:

Periodic is a rapid enterprise application framework for data driven web and mobile applications.

420 lines (379 loc) 12.7 kB
# What are Periodic Configurations? Configurations are database records of settings for you application segreated by the runtime environment. ```javascript //sample database configuration for the dbseed extension { "filepath": "content/config/extensions/periodicjs.ext.dbseed/development.json", "environment": "development", "config": { "settings": { "export": { "ignore_core_datas": [ "configuration", "extension" ], "split_count": 1000 }, "import": { "ignore_core_datas": [ "configuration", "extension" ] } }, } } ``` Each database configuration record has three required properties (*filepath*,*environment*,*config*) and one optional property (*container*). ```javascript { filepath, //the filepath is the unique field generated for each configuration, this field is automatically generated. environment, // the runtime environment for the database configuration config, // the configuration information container,// optional - but if you want the configuration specific to a certain container } ``` The configuration database has two Core Data models instantiated, the configuration model and the configuration model. The configuration Core Data model handles CRUD operations in the configuration database. ```javascript const periodicjs = require('periodicjs'); periodicjs.dbs.get('configuration');// your connected configuration database periodicjs.datas.get('configuration');// your configuration core data model (in the configuration database) periodicjs.datas.get('configuration');// your configuration core data model (in the configuration database) ``` There are four different types of declarative Configurations: 1. Application Configurations 2. Extension Configurations 3. Container Configurations 4. Database Definition & Override Configurations ## 1. Application Configurations Application configurations provide a mechanism to alter periodic's default functionality. The filepath for application configurations conform to the following pattern. ```javascript const ApplicationConfigFilepath = `content/config/environment/${periodicjs.config.process.runtime}.json`; //for example the configuration for your development environment would have the following filepath const developmentEnvironmentFilepath = 'content/config/environment/development.json'; ``` ```javascript //Sample Development configuration database record { "filepath": "content/config/environment/development.json", "environment": "development", "config": { "name": "My Application", "application": { "environment": "development", "cluster_process": false, "exit_on_invalid_extensions": false, "check_for_updates": true, "version": "10.1.0", "server": { "http": { "port": 8786 }, "https": { "port": 8787, "ssl": { "private_key": "node_modules/periodicjs/lib/defaults/demo/certs/2017.testperiodic.ssl_key.pem", "certificate": "node_modules/periodicjs/lib/defaults/demo/certs/2017.testperiodic.ssl_cert.pem" } } } }, "logger": { "use_winston_logger": true, "winston_exit_on_error": false, "use_standard_logging": true, "custom_logger_file_path": false, "custom_logger_node_modules": [] }, "express": { "config": { "trust_proxy": true, "use_static_caching": false, "use_compression": true, "debug": true, "csrf": true }, "views": { "template_engine": "ejs", "lru_cache": true, "lru": 100, "engine": "ejs", "package": "ejs", "extension": "ejs", "page_data": { "title": "Web Application", "version": "10.1.0", "description": "App Description", "author": "acme co" } }, "response_time": { "digits": 5 }, "use_flash": true, "body_parser": { "urlencoded": { "limit": "1mb", "extended": true }, "json": { "limit": "1mb" } }, "cookies": { "cookie_parser": "defaultcookiejson" }, "sessions": { "enabled": true, "type": "loki", "config": { "proxy": true, "resave": false, "saveUninitialized": false, "secret": "defaultsessionsecret", "cookie": { "expires": 604800000, "maxAge": 604800000, "secure": "auto" } } }, "routing": { "data": "/data", "extension": "/ext", "container": "/" } }, "periodic": { "version": "10.1.0", "emails": { "server_from_address": "Local Perodic App <hello@localhost>", "notification_address": "Local Perodic App <hello@localhost>" } }, "databases": { "standard": { "db": "lowkie", "options": { "dbpath": "content/config/settings/standard_db.json", "dboptions": { "verbose": true } }, "controller": { "default": { "protocol": { "adapter": "http", "api": "rest" }, "responder": { "adapter": "json" } } }, "router": { "ignore_models": [] } } }, "extensions": {}, "container": {} } } ``` ## 2. Extension Configurations Extension configurations provide a mechanism to alter an Extensions's default functionality. The filepath for extension configurations conform to the following pattern. ```javascript const ExtensionConfigFilepath = `content/config/extensions/${extension.name}/${periodicjs.config.process.runtime}.json`; //for example the configuration for your development environment would have the following filepath const developmentEnvironmentFilepath = 'content/config/extensions/periodicjs.ext.dbseed/development.json'; ``` Extension configurations require two properties, a *settings* property and a *database* property. ```javascript //Sample Development configuration database record { "filepath": "content/config/extensions/periodicjs.ext.dbseed/development.json", "environment": "development", "config": { "settings": { "defaults": true, "export": { "ignore_core_datas": [ "configuration", "extension" ], "split_count": 1000 }, "import": { "ignore_core_datas": [ "configuration", "extension" ] } }, "databases": {} } } ``` ## 3. Container Configurations Container configurations provide a mechanism to alter a Container's default functionality. The filepath for container configurations conform to the following pattern. ```javascript const ContainerConfigFilepath = `content/config/container/${container.name}/${periodicjs.config.process.runtime}.json`; //for example the configuration for your development environment would have the following filepath const developmentEnvironmentFilepath = 'content/config/container/periodicjs.ext.dbseed/development.json'; ``` Container configurations also require two properties, a *settings* property and a *database* property. ```javascript //Sample Development configuration database record { "filepath": "content/config/container/my-shopping-site /development.json", "environment": "development", "config": { "settings": { "defaults": true, "export": { "ignore_core_datas": [ "configuration", "extension" ], "split_count": 1000 }, "import": { "ignore_core_datas": [ "configuration", "extension" ] } }, "databases": {} } } ``` ## 4. Database Definition & Override Configurations In order to customize your application, you must define the connection details to your configuration database. Your definition file must either be a json file, a javascript object, or an asychronous javascript function that resolves an object with connection details. ### Database Definition This gives you an extreme amount of flexility on where/how to store credentials. The definition file is either `app_root/content/config/config.json` or `app_root/content/config/config.js` ```javascript //simple json file example - [app_root]/content/config/config.json { "configuration": { "type": "db", "db": "lowkie", "options": { "dbpath": "content/config/settings/config_db.json", }, }, "settings":{ "name":"My Application" } } //simple javascript file - [app_root]/content/config/config.js module.exports = { configuration: { type: 'db', db: 'mongoose', options: { url: process.env.CONFIG_DB_CONNETION_URL,// 'mongodb://localhost:27017/config_db', connection_options: {}, }, }, settings:{ name:'My Application' } }; //advanced asynchronous javascript function module.exports = () => { return new Promise ((resolve,reject)=>{ try{ someAsyncResource() .then(connectionSettings=>{ resolve({ configuration: { type: 'db', db: 'sequelize', options: { database: 'configdb', username: connectionSettings.username, password: connectionSettings.password, connection_options: { dialect: 'postgres', port: 5432, host: '127.0.0.1', }, }, }, settings:{ name:'My Application' } }); }) .catch(reject) } catch(e){ reject(e); } }); }; //The configuration property holds the information for you application's configuration database (can also be file based) configuration.type = "db" // can be either filebased or database driven "file" {db|file} configuration.db = "lowkie" // can be any valid core data orm adapter db {lowkie(loki)|mongoose(mongo)|sequelize(sql)|reddie(redis)} configuration.options = {/**/} //core data apadter connection options ``` ### Override Configurations In the same configuration file; either `app_root/content/config/config.json` or `app_root/content/config/config.js`, you can define override configurations on the settings property. All settings for Periodic are on the `periodic.settings` property. The application settings are assigned by merging default settings, environment settings and override settings. Default Settings -> Environment Settings -> Override Settings -> Application Settings ```javascript //app settings demonstration //in reality this happens during application start up, and is asynchronous (because configurations can be stored in files or databases) //default settings (cannot be modified) - periodicjs/lib/defaults/environment.js const defaultSettings = { name:'default app name', application:{ environment:'demo', port:8786, }, csrf: false, cluster_process: false, sessions:{ enabled:false, }, } //from configuration db - this.configuration.load({docid:'filepath',query:`content/config/environment/${this.config.process.runtime}.json`}) const environmentSettings = { application:{ environment:'staging', port:8786, }, sessions:{ enabled:true, type:'redis', }, } const overrideSettings = { name:'Accounting Pro', crsf: true, container: 'account_react_app@1.0.4', author: 'ACME Co', } periodic.settings = Object.assign({},defaultSettings,environmentSettings,overrideSettings); /* if environment is staging periodic.settings = { name:'Accounting Pro', application:{ environment:'staging', port:8786, }, sessions:{ enabled:true, type:'redis', }, crsf: true, container: 'account_react_app@1.0.4', author: 'ACME Co', } */ ``` NEXT: [ How are runtime environments configured? ](https://github.com/repetere/periodicjs/blob/master/doc/configuration/03-how-are-runtime-environments-configured.md)