Skip to content

Commit f0453f0

Browse files
Fixes to support creating a challenge with just name, projectId and status
1 parent 9a4a16f commit f0453f0

File tree

3 files changed

+47
-37
lines changed

3 files changed

+47
-37
lines changed

src/common/helper.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,7 @@ function calculateChallengeEndDate (challenge, data) {
546546
if (!phase || (!data.startDate && !challenge.startDate)) {
547547
return data.startDate || challenge.startDate
548548
}
549-
const phases = challenge.phases.reduce((obj, elem) => {
549+
const phases = (challenge.phases || []).reduce((obj, elem) => {
550550
obj[elem.id] = elem
551551
return obj
552552
}, {})

src/models/Challenge.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const schema = new Schema({
1818
},
1919
typeId: {
2020
type: String,
21-
required: true
21+
required: false
2222
},
2323
legacy: {
2424
type: Object,
@@ -30,7 +30,7 @@ const schema = new Schema({
3030
},
3131
description: {
3232
type: String,
33-
required: true
33+
required: false
3434
},
3535
privateDescription: {
3636
type: String,
@@ -42,36 +42,36 @@ const schema = new Schema({
4242
},
4343
timelineTemplateId: {
4444
type: String,
45-
required: true
45+
required: false
4646
},
4747
phases: {
4848
type: Array,
49-
required: true
49+
required: false
5050
},
5151
terms: {
5252
type: Array,
5353
required: false
5454
},
5555
prizeSets: {
5656
type: [Object],
57-
required: true
57+
required: false
5858
},
5959
// tag names
6060
tags: {
6161
type: Array,
62-
required: true
62+
required: false
6363
},
6464
projectId: {
6565
type: Number,
6666
required: false
6767
},
6868
startDate: {
6969
type: Date,
70-
required: true
70+
required: false
7171
},
7272
endDate: {
7373
type: Date,
74-
required: true
74+
required: false
7575
},
7676
status: {
7777
type: String,

src/services/ChallengeService.js

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,9 @@ async function populatePhases (phases, startDate, timelineTemplateId) {
410410
async function createChallenge (currentUser, challenge, userToken) {
411411
await helper.ensureProjectExist(challenge.projectId, userToken)
412412
await validateChallengeData(challenge)
413-
await helper.validatePhases(challenge.phases)
413+
if (challenge.phases && challenge.phases.length > 0) {
414+
await helper.validatePhases(challenge.phases)
415+
}
414416
helper.ensureNoDuplicateOrNullElements(challenge.tags, 'tags')
415417
helper.ensureNoDuplicateOrNullElements(challenge.groups, 'groups')
416418
helper.ensureNoDuplicateOrNullElements(challenge.terms, 'terms')
@@ -419,13 +421,17 @@ async function createChallenge (currentUser, challenge, userToken) {
419421
await ensureAccessibleByGroupsAccess(currentUser, challenge)
420422

421423
// populate phases
422-
await populatePhases(challenge.phases, challenge.startDate, challenge.timelineTemplateId)
424+
if (challenge.timelineTemplateId && challenge.phases && challenge.phases.length > 0) {
425+
await populatePhases(challenge.phases, challenge.startDate, challenge.timelineTemplateId)
426+
}
423427

424428
// populate challenge terms
425429
const projectTerms = await helper.getProjectDefaultTerms(challenge.projectId)
426430
challenge.terms = await helper.getChallengeTerms(_.union(projectTerms, challenge.terms))
427431

428-
challenge.endDate = helper.calculateChallengeEndDate(challenge)
432+
if (challenge.phases && challenge.phases.length > 0) {
433+
challenge.endDate = helper.calculateChallengeEndDate(challenge)
434+
}
429435
const ret = await helper.create('Challenge', _.assign({
430436
id: uuid(),
431437
created: new Date(),
@@ -450,26 +456,26 @@ async function createChallenge (currentUser, challenge, userToken) {
450456
createChallenge.schema = {
451457
currentUser: Joi.any(),
452458
challenge: Joi.object().keys({
453-
typeId: Joi.id(),
459+
typeId: Joi.optionalId(),
454460
legacy: Joi.object().keys({
455461
track: Joi.string().required(),
456462
reviewType: Joi.string().required(),
457463
confidentialityType: Joi.string().default(config.DEFAULT_CONFIDENTIALITY_TYPE),
458464
forumId: Joi.number().integer().positive(),
459465
informixModified: Joi.string()
460-
}).required(),
466+
}),
461467
name: Joi.string().required(),
462-
description: Joi.string().required(),
468+
description: Joi.string(),
463469
privateDescription: Joi.string(),
464470
metadata: Joi.array().items(Joi.object().keys({
465471
name: Joi.id(),
466472
value: Joi.string().required()
467473
})).unique((a, b) => a.type === b.type),
468-
timelineTemplateId: Joi.id(),
474+
timelineTemplateId: Joi.optionalId(),
469475
phases: Joi.array().items(Joi.object().keys({
470476
phaseId: Joi.id(),
471477
duration: Joi.number().positive()
472-
})).min(1).required(),
478+
})),
473479
prizeSets: Joi.array().items(Joi.object().keys({
474480
type: Joi.string().valid(_.values(constants.prizeSetTypes)).required(),
475481
description: Joi.string(),
@@ -478,11 +484,11 @@ createChallenge.schema = {
478484
type: Joi.string().required(),
479485
value: Joi.number().positive().required()
480486
})).min(1).required()
481-
})).min(1).required(),
482-
tags: Joi.array().items(Joi.string().required()).min(1).required(), // tag names
487+
})),
488+
tags: Joi.array().items(Joi.string().required()), // tag names
483489
projectId: Joi.number().integer().positive().required(),
484490
legacyId: Joi.number().integer().positive(),
485-
startDate: Joi.date().required(),
491+
startDate: Joi.date(),
486492
status: Joi.string().valid(_.values(constants.challengeStatuses)).required(),
487493
groups: Joi.array().items(Joi.string()), // group names
488494
gitRepoURLs: Joi.array().items(Joi.string().uri()),
@@ -531,13 +537,15 @@ async function getChallenge (currentUser, id) {
531537
await ensureAccessibleByGroupsAccess(currentUser, challenge)
532538
// FIXME: Temporarily hard coded as the migrad
533539
// populate type property based on the typeId
534-
try {
535-
const type = await helper.getById('ChallengeType', challenge.typeId)
536-
challenge.type = type.name
537-
} catch (e) {
538-
challenge.typeId = '45415132-79fa-4d13-a9ac-71f50020dc10'
539-
const type = await helper.getById('ChallengeType', challenge.typeId)
540-
challenge.type = type.name
540+
if (challenge.typeId) {
541+
try {
542+
const type = await helper.getById('ChallengeType', challenge.typeId)
543+
challenge.type = type.name
544+
} catch (e) {
545+
challenge.typeId = '45415132-79fa-4d13-a9ac-71f50020dc10'
546+
const type = await helper.getById('ChallengeType', challenge.typeId)
547+
challenge.type = type.name
548+
}
541549
}
542550
// delete challenge.typeId
543551

@@ -553,7 +561,9 @@ async function getChallenge (currentUser, id) {
553561
_.unset(challenge, 'privateDescription')
554562
}
555563

556-
getPhasesAndPopulate(challenge)
564+
if (challenge.phases && challenge.phases.length > 0) {
565+
getPhasesAndPopulate(challenge)
566+
}
557567

558568
return challenge
559569
}
@@ -569,7 +579,7 @@ getChallenge.schema = {
569579
* @param {Array} otherPhases the second phases array
570580
* @returns {Boolean} true if different, false otherwise
571581
*/
572-
function isDifferentPhases (phases, otherPhases) {
582+
function isDifferentPhases (phases = [], otherPhases) {
573583
if (phases.length !== otherPhases.length) {
574584
return true
575585
} else {
@@ -619,7 +629,7 @@ function isSamePrizeArray (prizes, otherPrizes) {
619629
* @param {Array} otherPrizeSets the second PrizeSet Array
620630
* @returns {Boolean} true if different, false otherwise
621631
*/
622-
function isDifferentPrizeSets (prizeSets, otherPrizeSets) {
632+
function isDifferentPrizeSets (prizeSets = [], otherPrizeSets) {
623633
const length = otherPrizeSets.length
624634
if (prizeSets.length === otherPrizeSets.length) {
625635
let used = Array(length).fill(false)
@@ -1019,20 +1029,20 @@ fullyUpdateChallenge.schema = {
10191029
directProjectId: Joi.number(),
10201030
forumId: Joi.number().integer().positive(),
10211031
informixModified: Joi.string()
1022-
}).required(),
1023-
typeId: Joi.id(),
1032+
}),
1033+
typeId: Joi.optionalId(),
10241034
name: Joi.string().required(),
1025-
description: Joi.string().required(),
1035+
description: Joi.string(),
10261036
privateDescription: Joi.string(),
10271037
metadata: Joi.array().items(Joi.object().keys({
10281038
name: Joi.id(),
10291039
value: Joi.string().required()
10301040
})).unique((a, b) => a.type === b.type),
1031-
timelineTemplateId: Joi.id(),
1041+
timelineTemplateId: Joi.optionalId(),
10321042
phases: Joi.array().items(Joi.object().keys({
10331043
phaseId: Joi.id(),
10341044
duration: Joi.number().positive()
1035-
})).min(1).required(),
1045+
})),
10361046
prizeSets: Joi.array().items(Joi.object().keys({
10371047
type: Joi.string().valid(_.values(constants.prizeSetTypes)).required(),
10381048
description: Joi.string(),
@@ -1041,8 +1051,8 @@ fullyUpdateChallenge.schema = {
10411051
type: Joi.string().required(),
10421052
value: Joi.number().positive().required()
10431053
})).min(1).required()
1044-
})).min(1).required(),
1045-
tags: Joi.array().items(Joi.string().required()).min(1).required(), // tag names
1054+
})),
1055+
tags: Joi.array().items(Joi.string().required()), // tag names
10461056
projectId: Joi.number().integer().positive().required(),
10471057
legacyId: Joi.number().integer().positive(),
10481058
startDate: Joi.date(),

0 commit comments

Comments
 (0)