diff --git a/nodejs/models/hosts.js b/nodejs/models/hosts.js index 12d7af4..dabe68d 100755 --- a/nodejs/models/hosts.js +++ b/nodejs/models/hosts.js @@ -2,7 +2,7 @@ const {promisify} = require('util'); const client = require('../utils/redis'); -const {processKeys, ObjectValidateError} = require('../utils/object_validate'); +const objValidate = require('../utils/object_validate'); const hostKeysMap = { 'host': {isRequired: true, type: 'string', min: 3, max: 500}, @@ -21,7 +21,7 @@ async function getInfo(data){ if(info){ info['host'] = data.host; - return info + return objValidate.parseFromString(hostKeysMap, info); } }catch(error){ @@ -63,9 +63,11 @@ async function listAllDetail(){ return out } -async function add(data, edit){ +async function add(data){ try{ - data = processKeys(hostKeysMap, data, edit); + console.log('host', data) + data = objValidate.processKeys(hostKeysMap, data); + if(data.host && await exists(data.host)){ let error = new Error('HostNameUsed'); @@ -96,18 +98,23 @@ async function edit(data, host){ // Check to see if host name changed if(data.host && data.host !== host){ + console.log('pre assign', hostData, data) + // Merge the current data into with the updated data - data = Object.assign({}, hostData, data); + let newData = Object.assign({}, hostData, data); + + // Remove the updated failed so it doesnt keep it + delete newData.updated; // Create a new record for the updated host. If that succeeds, // delete the old recored - if(await add(hostData)) await remove({host}); + if(await add(newData)) await remove({host}); }else{ // Update what ever fields that where passed. // Validate the passed data, ignoring required fields. - data = processKeys(hostKeysMap, data, true); + data = objValidate.processKeys(hostKeysMap, data, true); // Loop over the data fields and apply them to redis for(let key of Object.keys(data)){ diff --git a/nodejs/utils/object_validate.js b/nodejs/utils/object_validate.js index 72ba697..cc57249 100644 --- a/nodejs/utils/object_validate.js +++ b/nodejs/utils/object_validate.js @@ -32,6 +32,8 @@ function processKeys(map, data, partial){ continue; } + out[key] = data.hasOwnProperty(key) ? data[key] : returnOrCall(map[key].default); + if(data.hasOwnProperty(key) && process_type[map[key].type]){ let typeError = process_type[map[key].type](map[key], data[key]); if(typeError){ @@ -40,8 +42,6 @@ function processKeys(map, data, partial){ continue; } } - - out[key] = data.hasOwnProperty(key) ? data[key] : returnOrCall(map[key].default); } if(errors.length !== 0){ @@ -52,23 +52,41 @@ function processKeys(map, data, partial){ return out; } +function parseFromString(map, data){ + let types = { + boolean: function(value){ return value === 'true' ? true : false }, + number: Number, + string: String, + }; + + for(let key of Object.keys(data)){ + console.log('looking at', key) + if(map[key] && map[key].type){ + console.log('converting', data[key], 'to', map[key].type) + data[key] = types[map[key].type](data[key]); + } + } + + return data; +} + function ObjectValidateError(message) { - this.name = 'ObjectValidateError'; - this.message = (message || {}); - this.status = 422; + this.name = 'ObjectValidateError'; + this.message = (message || {}); + this.status = 422; } ObjectValidateError.prototype = Error.prototype; -module.exports = {processKeys, ObjectValidateError}; +module.exports = {processKeys, parseFromString, ObjectValidateError}; if (require.main === module) { const keys_map = { 'host': {isRequired: true, type: 'string', min: 3, max: 500}, 'ip': {isRequired: true, type: 'string', min: 3, max: 500}, 'updated': {default: function(){return (new Date).getTime()}, always:true}, - 'username': {isRequired: true, type: 'string'}, - 'targetPort': {isRequired: true, type: 'number', min:0, max:65535}, + 'username': {isRequired: true, type: 'string', always: true}, + 'targetport': {isRequired: true, type: 'number', min:0, max:65535}, 'forcessl': {isRequired: false, default: true, type: 'boolean'}, 'targetssl': {isRequired: false, default: false, type: 'boolean'}, } @@ -77,10 +95,21 @@ if (require.main === module) { host:'asdqwwd', ip: 'sdfwef', username: '', - targetPort: 8000 + targetport: 8000, + updated: 'dqwqwdq' })); - + + console.log(parseFromString(keys_map, { + host: 'stest.theta42.com', + ip: 'googs', + updated: '1577054966047', + username: 'william', + targetport: '8080', + forcessl: 'true', + targetssl: 'false' } + )) + }