@@ -640,7 +640,7 @@ searchChallenges.schema = {
640640 tags : Joi . array ( ) . items ( Joi . string ( ) ) ,
641641 includeAllTags : Joi . boolean ( ) . default ( true ) ,
642642 projectId : Joi . number ( ) . integer ( ) . positive ( ) ,
643- forumId : Joi . number ( ) . integer ( ) . positive ( ) ,
643+ forumId : Joi . number ( ) . integer ( ) ,
644644 legacyId : Joi . number ( ) . integer ( ) . positive ( ) ,
645645 status : Joi . string ( ) . valid ( _ . values ( constants . challengeStatuses ) ) ,
646646 group : Joi . string ( ) ,
@@ -722,13 +722,19 @@ async function validateChallengeData (challenge) {
722722 * @param {String } timelineTemplateId the timeline template id
723723 */
724724async function populatePhases ( phases , startDate , timelineTemplateId ) {
725- if ( ! phases || phases . length === 0 ) {
726- return
727- }
728725 if ( _ . isUndefined ( timelineTemplateId ) ) {
729726 throw new errors . BadRequestError ( `Invalid timeline template ID: ${ timelineTemplateId } ` )
730727 }
731728 const template = await helper . getById ( 'TimelineTemplate' , timelineTemplateId )
729+ if ( ! phases || phases . length === 0 ) {
730+ // auto populate phases
731+ for ( const p of template . phases ) {
732+ phases . push ( {
733+ phaseId : p . phaseId ,
734+ duration : p . defaultDuration
735+ } )
736+ }
737+ }
732738 const phaseDefinitions = await helper . scan ( 'Phase' )
733739 // generate phase instance ids
734740 for ( let i = 0 ; i < phases . length ; i += 1 ) {
@@ -861,7 +867,11 @@ async function createChallenge (currentUser, challenge, userToken) {
861867 throw new errors . BadRequestError ( `trackId and typeId are required to create a challenge` )
862868 }
863869 }
864- if ( challenge . timelineTemplateId && challenge . phases && challenge . phases . length > 0 ) {
870+
871+ if ( challenge . timelineTemplateId ) {
872+ if ( ! challenge . phases ) {
873+ challenge . phases = [ ]
874+ }
865875 await populatePhases ( challenge . phases , challenge . startDate , challenge . timelineTemplateId )
866876 }
867877
@@ -1072,7 +1082,7 @@ async function getChallenge (currentUser, id) {
10721082 // Remove privateDescription for unregistered users
10731083 let memberChallengeIds
10741084 if ( currentUser ) {
1075- if ( ! currentUser . isMachine ) {
1085+ if ( ! currentUser . isMachine && ! helper . hasAdminRole ( currentUser ) ) {
10761086 memberChallengeIds = await helper . listChallengesByMember ( currentUser . userId )
10771087 if ( ! _ . includes ( memberChallengeIds , challenge . id ) ) {
10781088 _ . unset ( challenge , 'privateDescription' )
@@ -1306,11 +1316,13 @@ async function update (currentUser, challengeId, data, userToken, isFull) {
13061316 }
13071317 }
13081318 }
1309- const newPhases = challenge . phases
1319+
1320+ const newPhases = _ . cloneDeep ( challenge . phases ) || [ ]
13101321 const newStartDate = data . startDate || challenge . startDate
13111322
13121323 await helper . validatePhases ( newPhases )
13131324 // populate phases
1325+
13141326 await populatePhases ( newPhases , newStartDate , data . timelineTemplateId || challenge . timelineTemplateId )
13151327 data . phases = newPhases
13161328 data . startDate = newStartDate
@@ -1793,7 +1805,7 @@ partiallyUpdateChallenge.schema = {
17931805 reviewType : Joi . string ( ) ,
17941806 confidentialityType : Joi . string ( ) . default ( config . DEFAULT_CONFIDENTIALITY_TYPE ) ,
17951807 directProjectId : Joi . number ( ) ,
1796- forumId : Joi . number ( ) . integer ( ) . positive ( ) ,
1808+ forumId : Joi . number ( ) . integer ( ) ,
17971809 isTask : Joi . boolean ( )
17981810 } ) . unknown ( true ) ,
17991811 task : Joi . object ( ) . keys ( {
0 commit comments