diff --git a/app.js b/app.js index 7d8bd50..1f1d36d 100644 --- a/app.js +++ b/app.js @@ -4,9 +4,9 @@ logger = require('morgan'), cookieParser = require('cookie-parser'), bodyParser = require('body-parser'), app = express(), -//jsonStore = reqlib('/lib/jsonStore.js'), +jsonStore = reqlib('/lib/jsonStore.js'), cors = require('cors'), -//store = reqlib('config/store.js'), +store = reqlib('config/store.js'), debug = reqlib('/lib/debug')('App'), utils = reqlib('/lib/utils.js'); @@ -29,17 +29,19 @@ app.use(cors()); //get settings app.get('/api/settings', function(req, res) { - var clients = []; - res.json({success:true, clients: clients}); + res.json({success:true, clients: jsonStore.get(store.clients), values: jsonStore.get(store.values)}); +}); + +//get clients +app.get('/api/clients', function(req, res) { + res.json({success:true, clients: jsonStore.get(store.clients)}); }); //update settings -app.post('/api/settings', function(req, res) { - jsonStore.put(store.settings, req.body) +app.post('/api/clients', function(req, res) { + jsonStore.put(store.clients, req.body.clients) .then(data => { res.json({success: true, message: "Configuration updated successfully"}); - gw.close(); - startGateway(); }).catch(err => { debug(err); res.json({success: false, message: err.message}) diff --git a/bin/www b/bin/www index 14b7662..9f75111 100644 --- a/bin/www +++ b/bin/www @@ -4,88 +4,99 @@ * Module dependencies. */ -var app = require('../app'); -var reqlib = require('app-root-path').require; -var debug = reqlib('/lib/debug')('App'); -var http = require('http'); - -/** - * Get port from environment and store in Express. - */ - -var port = normalizePort(process.env.PORT || '8100'); -app.set('port', port); - -/** - * Create HTTP server. - */ - -var server = http.createServer(app); - -/** - * Listen on provided port, on all network interfaces. - */ - -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); - -/** - * Normalize a port into a number, string, or false. - */ - -function normalizePort(val) { - var port = parseInt(val, 10); - - if (isNaN(port)) { - // named pipe - return val; - } - - if (port >= 0) { - // port number - return port; - } - - return false; -} - -/** - * Event listener for HTTP server "error" event. - */ - -function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } -} - -/** - * Event listener for HTTP server "listening" event. - */ - -function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); -} +var app = require('../app') +var reqlib = require('app-root-path').require +var store = reqlib('/config/store.js') +var debug = reqlib('/lib/debug')('App') +var conf = reqlib('/config/app.js') +var jsonStore = reqlib('/lib/jsonStore.js') +var http = require('http') + +// jsonstore is a singleton instance that handles the json configuration files +// used in the application. Init it before anything else than start app. +// if jsonstore fails exit the application +jsonStore.init(store) + .then((data) => { + + /** + * Normalize a port into a number, string, or false. + */ + + function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; + } + + /** + * Event listener for HTTP server "error" event. + */ + + function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' ? + 'Pipe ' + port : + 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } + } + + /** + * Event listener for HTTP server "listening" event. + */ + + function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' ? + 'pipe ' + addr : + 'port ' + addr.port; + debug('Listening on ' + bind); + } + + /** + * Get port from environment and store in Express. + */ + var port = normalizePort(process.env.PORT || conf.port); + app.set('port', port); + + /** + * Create HTTP server. + */ + + var server = http.createServer(app); + + /** + * Listen on provided port, on all network interfaces. + */ + + server.listen(port); + server.on('error', onError); + server.on('listening', onListening); + + }) + .catch(err => debug(err)) diff --git a/config/app.js b/config/app.js new file mode 100644 index 0000000..93e19ba --- /dev/null +++ b/config/app.js @@ -0,0 +1,5 @@ +// config/app.js +module.exports = { + 'storeDir': 'store', + 'port': 8100 +}; diff --git a/config/store.js b/config/store.js new file mode 100644 index 0000000..adb496c --- /dev/null +++ b/config/store.js @@ -0,0 +1,5 @@ +// config/store.js +module.exports = { + 'clients' : {file: 'clients.json', default: []} , + 'values' : {file: 'values.json', default: []} , +}; diff --git a/lib/jsonStore.js b/lib/jsonStore.js new file mode 100644 index 0000000..5c91e77 --- /dev/null +++ b/lib/jsonStore.js @@ -0,0 +1,67 @@ +'use strict' + +// eslint-disable-next-line one-var +var jsonfile = require('jsonfile'), + reqlib = require('app-root-path').require, + storeDir = reqlib('config/app.js').storeDir, + Promise = require('bluebird'), + debug = reqlib('/lib/debug')('Store'), + utils = reqlib('lib/utils.js') + +debug.color = 3 + +function getFile (config) { + return new Promise((resolve, reject) => { + jsonfile.readFile(utils.joinPath(utils.getPath(true), storeDir, config.file), function (err, data) { + if (err && err.code !== 'ENOENT') { + reject(err) + } else { + if (err && err.code === 'ENOENT') { debug(config.file, 'not found') } + + resolve({file: config.file, data: data || config.default}) + } + }) + }) +} + +/** +Constructor +**/ +function StorageHelper () { + this.store = {} +} + +StorageHelper.prototype.init = function (config) { + return new Promise((resolve, reject) => { + storage_helper.config = config + Promise.map(Object.keys(config), function (model) { + return getFile(config[model]) + }).then(results => { + for (var i = 0; i < results.length; i++) { + storage_helper.store[results[i].file] = results[i].data + } + resolve(storage_helper.store) + }) + .catch(err => reject(err)) + }) +} + +StorageHelper.prototype.get = function (model) { + if (storage_helper.store[model.file]) { return storage_helper.store[model.file] } else { throw Error('Requested file not present in store: ' + model.file) } +} + +StorageHelper.prototype.put = function (model, data) { + return new Promise((resolve, reject) => { + jsonfile.writeFile(utils.joinPath(utils.getPath(true), storeDir, model.file), data, function (err) { + if (err) { + reject(err) + } else { + storage_helper.store[model.file] = data + resolve(storage_helper.store[model.file]) + } + }) + }) +} + +// eslint-disable-next-line camelcase +var storage_helper = module.exports = exports = new StorageHelper() diff --git a/package-lock.json b/package-lock.json index 7dca24c..7fc97e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4143,8 +4143,7 @@ "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "growly": { "version": "1.3.0", @@ -4885,6 +4884,15 @@ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, + "jsonfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-5.0.0.tgz", + "integrity": "sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==", + "requires": { + "graceful-fs": "4.1.15", + "universalify": "0.1.2" + } + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -9678,6 +9686,11 @@ "imurmurhash": "0.1.4" } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index d5537af..31226ca 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "ejs": "~2.5.7", "express": "~4.16.0", "http-errors": "~1.6.2", + "jsonfile": "^5.0.0", "morgan": "~1.9.0", "vue": "^2.5.2", "vue-router": "^3.0.1", diff --git a/src/App.vue b/src/App.vue index 1a50890..0b630f8 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,5 @@