engine.js
2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
'use strict'
/**
* indicative
*
* (c) Harminder Virk <virk@adonisjs.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
const Validations = require('../Validations')
const Messages = require('../Messages')
const _ = require('lodash')
const pSettle = require('p-settle')
const pSeries = require('p-series')
const PLazy = require('p-lazy')
const ValidationEngine = exports = module.exports = {}
/**
* validates a field with all assigned validations for that
* field.
*
* @param {Object} data
* @param {String} field
* @param {Object} validations
* @param {Object} messages
* @param {Object} formatter
* @param {Boolean} [runAll]
*
* @return {Promise<Array>}
*/
ValidationEngine.validateField = function (data, field, validations, messages, formatter, runAll) {
const validationsMap = _.map(validations, (validation) => {
return ValidationEngine.runValidationOnField(data, field, validation.name, messages, validation.args, formatter)
})
return runAll ? pSettle(validationsMap) : function () {
return pSeries(validationsMap)
}
}
/**
* runs a single validation on a given field.
*
* @param {Object} data
* @param {String} field
* @param {String} validation
* @param {Object} messages
* @param {Array} [args]
*
* @return {Promise}
*/
ValidationEngine.runValidationOnField = function (data, field, validation, messages, args, formatter) {
const message = Messages.make(messages, field, validation, args)
return new PLazy((resolve, reject) => {
return Promise.resolve(ValidationEngine.getValidationMethod(validation))
.then((validationMethod) => {
return validationMethod(data, field, message, args, _.get)
})
.then(resolve)
.catch((error) => {
if (error && typeof (error) === 'object' && error.code === 'ENGINE_EXCEPTION') {
formatter.addError({ field, validation: 'ENGINE_EXCEPTION', message: error.message })
} else {
formatter.addError({ field, validation, message: error })
}
reject(new Error(error))
})
})
}
/**
* returns the validation method from the Validations
* store or throws an error saying validation not
* found.
*
* @param {String} validation
*
* @return {Function}
*
* @throws {Error} If validation is not found
*/
ValidationEngine.getValidationMethod = function (validation) {
return _.get(Validations, _.camelCase(validation), function () {
const error = new Error(`${validation} is not defined as a validation`)
error.code = 'ENGINE_EXCEPTION'
throw error
})
}