Skip to content

Commit 14a70ef

Browse files
Add support for isDefault on Challenge Timeline Template Object
1 parent 2c7d92d commit 14a70ef

File tree

4 files changed

+46
-5
lines changed

4 files changed

+46
-5
lines changed

docs/swagger.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -1736,6 +1736,11 @@ paths:
17361736
description: Filter by timeline template id
17371737
required: false
17381738
type: string
1739+
- name: isDefault
1740+
in: query
1741+
description: Filter by is default flag
1742+
required: false
1743+
type: boolean
17391744
responses:
17401745
'200':
17411746
description: OK
@@ -2580,6 +2585,9 @@ definitions:
25802585
timelineTemplateId:
25812586
type: string
25822587
format: UUID
2588+
isDefault:
2589+
type: boolean
2590+
default: false
25832591
required:
25842592
- typeId
25852593
- trackId

src/models/ChallengeTimelineTemplate.js

+4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ const schema = new Schema({
2323
timelineTemplateId: {
2424
type: String,
2525
required: true
26+
},
27+
isDefault: {
28+
type: Boolean,
29+
required: false
2630
}
2731
},
2832
{

src/services/ChallengeService.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,8 @@ async function createChallenge (currentUser, challenge, userToken) {
782782
if (challenge.typeId && challenge.trackId) {
783783
const [challengeTimelineTemplate] = await ChallengeTimelineTemplateService.searchChallengeTimelineTemplates({
784784
typeId: challenge.typeId,
785-
trackId: challenge.trackId
785+
trackId: challenge.trackId,
786+
isDefault: true
786787
})
787788
if (!challengeTimelineTemplate) {
788789
throw new errors.BadRequestError(`The selected trackId ${challenge.trackId} and typeId: ${challenge.typeId} does not have a default timeline template. Please provide a timelineTemplateId`)

src/services/ChallengeTimelineTemplateService.js

+32-4
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,36 @@ const constants = require('../../app-constants')
1818
async function searchChallengeTimelineTemplates (criteria) {
1919
const list = await helper.scan('ChallengeTimelineTemplate')
2020
const records = _.filter(list, e => (!criteria.typeId || criteria.typeId === e.typeId) &&
21-
(!criteria.timelineTemplateId || criteria.timelineTemplateId === e.timelineTemplateId))
21+
(!criteria.timelineTemplateId || criteria.timelineTemplateId === e.timelineTemplateId) &&
22+
(!criteria.trackId || criteria.trackId === e.trackId) &&
23+
(!criteria.isDefault || criteria.isDefault === e.isDefault))
2224
return records
2325
}
2426

2527
searchChallengeTimelineTemplates.schema = {
2628
criteria: Joi.object().keys({
2729
typeId: Joi.optionalId(),
2830
trackId: Joi.optionalId(),
29-
timelineTemplateId: Joi.optionalId()
31+
timelineTemplateId: Joi.optionalId(),
32+
isDefault: Joi.boolean()
3033
})
3134
}
3235

36+
/**
37+
* Unset existing default timeline template in order to create a new one
38+
* @param {String} typeId the type ID
39+
* @param {String} trackId the track ID
40+
*/
41+
async function unsetDefaultTimelineTemplate (typeId, trackId) {
42+
const records = await searchChallengeTimelineTemplates({ typeId, trackId, isDefault: true })
43+
if (records.length === 0) {
44+
return
45+
}
46+
for (const record of records) {
47+
await fullyUpdateChallengeTimelineTemplate(record.id, { ...record, isDefault: false })
48+
}
49+
}
50+
3351
/**
3452
* Create challenge type timeline template.
3553
* @param {Object} data the data to create challenge type timeline template
@@ -46,6 +64,10 @@ async function createChallengeTimelineTemplate (data) {
4664
await helper.getById('ChallengeTrack', data.trackId)
4765
await helper.getById('TimelineTemplate', data.timelineTemplateId)
4866

67+
if (data.isDefault) {
68+
await unsetDefaultTimelineTemplate(data.typeId, data.trackId)
69+
}
70+
4971
const ret = await helper.create('ChallengeTimelineTemplate', _.assign({ id: uuid() }, data))
5072
// post bus event
5173
await helper.postBusEvent(constants.Topics.ChallengeTimelineTemplateCreated, ret)
@@ -56,7 +78,8 @@ createChallengeTimelineTemplate.schema = {
5678
data: Joi.object().keys({
5779
typeId: Joi.id(),
5880
trackId: Joi.id(),
59-
timelineTemplateId: Joi.id()
81+
timelineTemplateId: Joi.id(),
82+
isDefault: Joi.boolean().default(false).required()
6083
}).required()
6184
}
6285

@@ -84,7 +107,8 @@ async function fullyUpdateChallengeTimelineTemplate (challengeTimelineTemplateId
84107

85108
if (record.typeId === data.typeId &&
86109
record.trackId === data.trackId &&
87-
record.timelineTemplateId === data.timelineTemplateId) {
110+
record.timelineTemplateId === data.timelineTemplateId &&
111+
record.isDefault === data.isDefault) {
88112
// no change
89113
return record
90114
}
@@ -99,6 +123,10 @@ async function fullyUpdateChallengeTimelineTemplate (challengeTimelineTemplateId
99123
await helper.getById('ChallengeTrack', data.trackId)
100124
await helper.getById('TimelineTemplate', data.timelineTemplateId)
101125

126+
if (data.isDefault) {
127+
await unsetDefaultTimelineTemplate(data.typeId, data.trackId)
128+
}
129+
102130
const ret = await helper.update(record, data)
103131
// post bus event
104132
await helper.postBusEvent(constants.Topics.ChallengeTimelineTemplateUpdated, ret)

0 commit comments

Comments
 (0)