1
1
import pick from 'lodash/pick' ;
2
2
import Project from '../models/project' ;
3
3
import createId from '../utils/createId' ;
4
+ import createApplicationErrorClass from '../utils/createApplicationErrorClass' ;
5
+
6
+ export const FileValidationError = createApplicationErrorClass ( 'FileValidationError' ) ;
7
+
4
8
5
9
// objectID().toHexString();
6
10
/**
@@ -23,10 +27,11 @@ export function toApi(model) {
23
27
* - each file/folder gets a generated BSON-ID
24
28
* - each folder has a `children` array containing the IDs of it's children
25
29
*/
26
- function transformFilesInner ( files = { } , parentNode ) {
27
- const allFiles = [ ] ;
30
+ function transformFilesInner ( tree = { } , parentNode ) {
31
+ const files = [ ] ;
32
+ const errors = [ ] ;
28
33
29
- Object . entries ( files ) . forEach ( ( [ name , params ] ) => {
34
+ Object . entries ( tree ) . forEach ( ( [ name , params ] ) => {
30
35
const id = createId ( ) ;
31
36
const isFolder = params . files != null ;
32
37
@@ -38,11 +43,13 @@ function transformFilesInner(files = {}, parentNode) {
38
43
children : [ ] // Initialise an empty folder
39
44
} ;
40
45
41
- allFiles . push ( folder ) ;
46
+ files . push ( folder ) ;
42
47
43
48
// The recursion will return a list of child files/folders
44
49
// It will also push the child's id into `folder.children`
45
- allFiles . push ( ...transformFilesInner ( params . files , folder ) ) ;
50
+ const subFolder = transformFilesInner ( params . files , folder ) ;
51
+ files . push ( ...subFolder . files ) ;
52
+ errors . push ( ...subFolder . errors ) ;
46
53
} else {
47
54
const file = {
48
55
_id : id ,
@@ -55,10 +62,10 @@ function transformFilesInner(files = {}, parentNode) {
55
62
} else if ( typeof params . content === 'string' ) {
56
63
file . content = params . content ;
57
64
} else {
58
- throw new Error ( ' url or params must be supplied' ) ;
65
+ errors . push ( { name , message : 'missing \' url\' or \'content\'' } ) ;
59
66
}
60
67
61
- allFiles . push ( file ) ;
68
+ files . push ( file ) ;
62
69
}
63
70
64
71
// Push this child's ID onto it's parent's list
@@ -68,17 +75,31 @@ function transformFilesInner(files = {}, parentNode) {
68
75
}
69
76
} ) ;
70
77
71
- return allFiles ;
78
+ return { files , errors } ;
72
79
}
73
80
74
- export function transformFiles ( files = { } ) {
81
+ export function transformFiles ( tree = { } ) {
75
82
const withRoot = {
76
83
root : {
77
- files
84
+ files : tree
78
85
}
79
86
} ;
80
87
81
- return transformFilesInner ( withRoot ) ;
88
+ const { files, errors } = transformFilesInner ( withRoot ) ;
89
+
90
+ if ( errors . length > 0 ) {
91
+ const message = `${ errors . length } files failed validation. See error.files for individual errors.
92
+
93
+ Errors:
94
+ ${ errors . map ( e => `* ${ e . name } : ${ e . message } ` ) . join ( '\n' ) }
95
+ ` ;
96
+ const error = new FileValidationError ( message ) ;
97
+ error . files = errors ;
98
+
99
+ throw error ;
100
+ }
101
+
102
+ return files ;
82
103
}
83
104
84
105
/**
0 commit comments