@@ -26,6 +26,23 @@ export class Validator {
26
26
// Public Methods
27
27
// -------------------------------------------------------------------------
28
28
29
+ validateAsync < T > ( objectClass : Function , object : T , validationOptions ?: ValidationOptions ) : Promise < T > {
30
+ return new Promise < T > ( ( ok , fail ) => { // todo install promise
31
+ let errors = this . validate ( objectClass , object , validationOptions ) ;
32
+ if ( errors . length > 0 ) {
33
+ fail ( errors ) ;
34
+ } else {
35
+ ok ( object ) ;
36
+ }
37
+ } ) ;
38
+ }
39
+
40
+ validateOrThrow ( objectClass : Function , object : any , validationOptions ?: ValidationOptions ) {
41
+ const errors = this . validate ( objectClass , object , validationOptions ) ;
42
+ if ( errors . length > 0 )
43
+ throw new Error ( 'Validation failed: ' + JSON . stringify ( errors ) ) ; // todo
44
+ }
45
+
29
46
validate ( objectClass : Function , object : any , validationOptions ?: ValidationOptions ) : ValidationError [ ] {
30
47
let groups = validationOptions ? validationOptions . groups : undefined ;
31
48
let metadatas = this . metadataStorage . getValidationMetadatasForObject ( objectClass , groups ) ;
@@ -38,16 +55,16 @@ export class Validator {
38
55
let errors = duplicateMetadatas . map ( metadata => {
39
56
let isValid = true ;
40
57
if ( metadata . each ) {
41
- if ( value instanceof Array ) {
42
-
58
+ if ( value instanceof Array )
43
59
isValid = value . every ( ( v : any ) => this . performValidation ( v , metadata ) ) ;
44
- }
60
+
45
61
} else {
46
62
isValid = this . performValidation ( value , metadata ) ;
47
63
}
48
64
if ( isValid ) return null ;
49
65
50
66
return < ValidationError > {
67
+ objectClass : objectClass ,
51
68
property : metadata . propertyName ,
52
69
errorCode : metadata . type ,
53
70
errorName : ValidationTypesUtils . getCodeName ( metadata . type ) ,
@@ -57,12 +74,29 @@ export class Validator {
57
74
} ;
58
75
} ) ;
59
76
60
- if ( value instanceof Array ) {
77
+ let nestedValidation = duplicateMetadatas . reduce ( ( found , metadata ) => {
78
+ return metadata . type === ValidationTypes . NESTED_VALIDATION ? metadata : found ;
79
+ } , undefined ) ;
80
+ if ( nestedValidation ) {
81
+ if ( value instanceof Array ) {
82
+ value . map ( ( v : any ) => {
83
+ const nestedErrors = this . validate ( metadata . value1 ( ) , v , validationOptions ) ;
84
+ if ( nestedErrors && nestedErrors . length )
85
+ errors = errors . concat ( nestedErrors ) ;
86
+ } ) ;
87
+
88
+ } else if ( value instanceof Object ) {
89
+ const nestedErrors = this . validate ( metadata . value1 , value , validationOptions ) ;
90
+ if ( nestedErrors && nestedErrors . length )
91
+ errors = errors . concat ( nestedErrors ) ;
61
92
93
+ } else {
94
+ throw new Error ( 'Only objects and arrays are supported to nested validation' ) ;
95
+ }
62
96
}
63
97
64
- if ( errors . length > 0 && errors . indexOf ( null ) !== - 1 )
65
- return null ;
98
+ // if (errors.length > 0 && errors.indexOf(null) !== -1)
99
+ // return null;
66
100
67
101
return errors . reduceRight ( ( found , err ) => err !== null ? err : found , null ) ;
68
102
0 commit comments