@@ -79,51 +79,61 @@ exports.register = function (server, options, next) {
7979 } ;
8080
8181 Joi . validate ( request . payload , schema . testPage , function ( err , pageWithTests ) {
82+ let errObj = { } ;
8283 if ( err ) {
83- let errObj = { } ;
84+ server . log ( [ 'error' ] , err ) ;
8485 try {
85- const valErr = err . details [ 0 ] ;
86- switch ( valErr . path ) {
87- case 'title' :
88- errObj . titleError = defaults . errors . title ;
89- break ;
90- default :
91- const idx = valErr . path . split ( '.' ) [ 1 ] ;
92- switch ( valErr . context . key ) {
93- case 'title' :
94- request . payload . test [ idx ] . codeTitleError = defaults . errors . codeTitle ;
95- break ;
96- case 'code' :
97- request . payload . test [ idx ] . codeError = defaults . errors . code ;
98- break ;
99- default :
100- throw err ;
101- }
86+ if ( err . details [ 0 ] . path === 'title' ) {
87+ errObj . titleError = defaults . errors . title ;
88+ } else {
89+ throw err ;
10290 }
10391 } catch ( ex ) {
10492 server . log ( [ 'error' ] , ex ) ;
10593 errObj . genError = defaults . errors . general ;
10694 }
10795 errResp ( errObj ) ;
10896 } else {
109- let isOwn = false ;
97+ // additional validation that's not possible or insanely complex w/ Joi
98+ let wasAdditionalValidationError = false ;
99+ pageWithTests . test . forEach ( ( t , idx ) => {
100+ const missingTitle = t . title === defaults . deleteMe ;
101+ const missingCode = t . code === defaults . deleteMe ;
110102
111- pagesService . getBySlug ( request . params . testSlug , request . params . rev )
112- . then ( values => {
113- const prevPage = values [ 0 ] ;
114- const own = request . yar . get ( 'own' ) || { } ;
115- isOwn = own [ prevPage . id ] ;
116- const isAdmin = request . yar . get ( 'admin' ) ;
117- let update = ! ! ( isAdmin || isOwn ) ;
118- return pagesService . edit ( pageWithTests , update , prevPage . maxRev , prevPage . id ) ;
119- } )
120- . then ( resultingRevision => {
121- request . yar . set ( 'authorSlug' , pageWithTests . author . replace ( ' ' , '-' ) . replace ( / [ ^ a - z A - Z 0 - 9 - ] / , '' ) ) ;
103+ if ( missingTitle && ! missingCode ) {
104+ wasAdditionalValidationError = true ;
105+ request . payload . test [ idx ] . codeTitleError = defaults . errors . codeTitle ;
106+ }
107+
108+ if ( missingCode && ! missingTitle ) {
109+ wasAdditionalValidationError = true ;
110+ request . payload . test [ idx ] . codeError = defaults . errors . code ;
111+ }
112+ } ) ;
122113
123- const r = resultingRevision > 1 ? `/${ resultingRevision } ` : '' ;
114+ if ( wasAdditionalValidationError ) {
115+ errResp ( errObj ) ;
116+ } else {
117+ let isOwn = false ;
118+
119+ pagesService . getBySlug ( request . params . testSlug , request . params . rev )
120+ . then ( values => {
121+ const prevPage = values [ 0 ] ;
122+ const own = request . yar . get ( 'own' ) || { } ;
123+ isOwn = own [ prevPage . id ] ;
124+ const isAdmin = request . yar . get ( 'admin' ) ;
125+ let update = ! ! ( isAdmin || isOwn ) ;
126+ server . log ( 'debug' , `isAdmin: ${ isAdmin } isOwn: ${ isOwn } update: ${ update } ` ) ;
127+ return pagesService . edit ( pageWithTests , update , prevPage . maxRev , prevPage . id ) ;
128+ } )
129+ . then ( resultingRevision => {
130+ request . yar . set ( 'authorSlug' , pageWithTests . author . replace ( ' ' , '-' ) . replace ( / [ ^ a - z A - Z 0 - 9 - ] / , '' ) ) ;
124131
125- reply . redirect ( `/${ request . params . testSlug } ${ r } ` ) ;
126- } ) . catch ( errResp ) ;
132+ const r = resultingRevision > 1 ? `/${ resultingRevision } ` : '' ;
133+
134+ reply . redirect ( `/${ request . params . testSlug } ${ r } ` ) ;
135+ } ) . catch ( errResp ) ;
136+ }
127137 }
128138 } ) ;
129139 }
0 commit comments