Skip to content

Commit 60b3c1c

Browse files
committed
add config.js validation
1 parent ad8b2b3 commit 60b3c1c

File tree

3 files changed

+99
-5
lines changed

3 files changed

+99
-5
lines changed

index.js

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,57 @@
11

22
var dingDong = require('ding-dong');
3+
var Joi = require('joi');
34

45
var Handler = require('./lib/handler');
56
var Logger = require('./lib/logger');
7+
var ConfigSchema = require('./lib/configSchema');
68

79
var SourceFactory = require('./lib/source/sourceFactory');
810
var RecognizerFactory = require('./lib/recognize/recognizerFactory');
911

1012
var Server = function (config) {
1113

12-
this.start = function () {
14+
var logger;
15+
16+
var log = function (text, object) {
17+
if (logger) {
18+
logger.info(text, object);
19+
} else {
20+
console.log(text, object);
21+
}
22+
};
23+
24+
var validate = function (callback) {
25+
Joi.validate(config, ConfigSchema, callback);
26+
};
1327

28+
var init = function () {
1429
var source = (new SourceFactory(config['lookup'])).make();
1530
var recognizer = (new RecognizerFactory(config['recognize'])).make();
1631

1732
var handler = new Handler(source, recognizer, config);
1833

1934
if (config['logger']) {
20-
var logger = new Logger(config['logger']);
35+
logger = new Logger(config['logger']);
2136
handler.setLogger(logger);
2237
}
2338

2439
dingDong
2540
.createServer(handler.handle)
2641
.listen(config.server['port']);
2742

28-
if (logger) {
29-
logger.info('server started');
30-
}
43+
log('server started');
44+
};
45+
46+
this.start = function () {
47+
validate(function (err, value) {
48+
if (err) {
49+
log('config.js have errors', err);
50+
} else {
51+
log('config.js validated successfully!');
52+
init();
53+
}
54+
});
3155
};
3256
};
3357

lib/configSchema.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
'use strict';
2+
3+
var Joi = require('joi');
4+
5+
var ConfigSchema = Joi.object().keys({
6+
server: Joi.object().keys({
7+
port: Joi.number().integer().min(1).max(65535).required()
8+
}).required(),
9+
processing: Joi.object().keys({
10+
totalAttempts: Joi.number().min(1).max(20).default(2),
11+
playGreeting: Joi.boolean().default(true),
12+
playBeepBeforeRecording: Joi.boolean().default(true)
13+
}).required(),
14+
asterisk: Joi.object().keys({
15+
sounds: Joi.object().keys({
16+
onErrorBeforeFinish: Joi.string(),
17+
onErrorBeforeRepeat: Joi.string(),
18+
greeting: Joi.string()
19+
}).required()
20+
}).required(),
21+
record: Joi.object().keys({
22+
directory: Joi.string().default('/tmp'),
23+
type: Joi.string().valid('wav', 'gsm'),
24+
duration: Joi.number().min(1).max(60)
25+
}).required(),
26+
recognize: Joi.object().keys({
27+
directory: Joi.string().default('/tmp'),
28+
type: Joi.string().required().valid('google', 'yandex'),
29+
options: Joi.object().keys({
30+
developer_key: Joi.string().required()
31+
}).required()
32+
}).required(),
33+
lookup: Joi.object().keys({
34+
type: Joi.string().required().valid('file', 'mongo', 'mysql'),
35+
options: Joi.alternatives()
36+
.when('type', {is: 'file', then: Joi.object().keys({
37+
dataFile: Joi.string().required()
38+
})
39+
})
40+
.when('type', {is: 'mongo', then: Joi.object().keys({
41+
url: Joi.string().required(),
42+
collection: Joi.string().required()
43+
})
44+
})
45+
.when('type', {is: 'mysql', then: Joi.object().keys({
46+
host: Joi.string().required(),
47+
port: Joi.number().required(),
48+
username: Joi.string().required(),
49+
password: Joi.string().required(),
50+
database: Joi.string().required(),
51+
table: Joi.string().required()
52+
})
53+
})
54+
}).required(),
55+
logger: Joi.object().keys({
56+
console: Joi.object().keys({
57+
colorize: Joi.boolean().default(true)
58+
}),
59+
syslog: Joi.object().keys({
60+
host: Joi.string().required()
61+
}),
62+
file: Joi.object().keys({
63+
filename: Joi.string().required(),
64+
json: Joi.boolean().default(false)
65+
}),
66+
})
67+
});
68+
69+
module.exports = ConfigSchema;

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"dependencies": {
77
"ding-dong": "0.0.9",
88
"google-speech": "0.0.2",
9+
"joi": "^6.0.8",
910
"jugglingdb": "^0.3.0",
1011
"jugglingdb-mongodb": "0.0.4-4",
1112
"jugglingdb-mysql": "0.0.10",

0 commit comments

Comments
 (0)