From 14a70efacc82431f64978753f43ec40aebc12a86 Mon Sep 17 00:00:00 2001 From: Thomas Kranitsas Date: Wed, 7 Oct 2020 17:02:00 +0300 Subject: [PATCH] Add support for isDefault on Challenge Timeline Template Object --- docs/swagger.yaml | 8 +++++ src/models/ChallengeTimelineTemplate.js | 4 +++ src/services/ChallengeService.js | 3 +- .../ChallengeTimelineTemplateService.js | 36 ++++++++++++++++--- 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index e1e14c8e..11279b7c 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1736,6 +1736,11 @@ paths: description: Filter by timeline template id required: false type: string + - name: isDefault + in: query + description: Filter by is default flag + required: false + type: boolean responses: '200': description: OK @@ -2580,6 +2585,9 @@ definitions: timelineTemplateId: type: string format: UUID + isDefault: + type: boolean + default: false required: - typeId - trackId diff --git a/src/models/ChallengeTimelineTemplate.js b/src/models/ChallengeTimelineTemplate.js index 0d8e9b04..881e521e 100644 --- a/src/models/ChallengeTimelineTemplate.js +++ b/src/models/ChallengeTimelineTemplate.js @@ -23,6 +23,10 @@ const schema = new Schema({ timelineTemplateId: { type: String, required: true + }, + isDefault: { + type: Boolean, + required: false } }, { diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 7ff7df53..653be787 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -782,7 +782,8 @@ async function createChallenge (currentUser, challenge, userToken) { if (challenge.typeId && challenge.trackId) { const [challengeTimelineTemplate] = await ChallengeTimelineTemplateService.searchChallengeTimelineTemplates({ typeId: challenge.typeId, - trackId: challenge.trackId + trackId: challenge.trackId, + isDefault: true }) if (!challengeTimelineTemplate) { throw new errors.BadRequestError(`The selected trackId ${challenge.trackId} and typeId: ${challenge.typeId} does not have a default timeline template. Please provide a timelineTemplateId`) diff --git a/src/services/ChallengeTimelineTemplateService.js b/src/services/ChallengeTimelineTemplateService.js index a9209839..f432f432 100644 --- a/src/services/ChallengeTimelineTemplateService.js +++ b/src/services/ChallengeTimelineTemplateService.js @@ -18,7 +18,9 @@ const constants = require('../../app-constants') async function searchChallengeTimelineTemplates (criteria) { const list = await helper.scan('ChallengeTimelineTemplate') const records = _.filter(list, e => (!criteria.typeId || criteria.typeId === e.typeId) && - (!criteria.timelineTemplateId || criteria.timelineTemplateId === e.timelineTemplateId)) + (!criteria.timelineTemplateId || criteria.timelineTemplateId === e.timelineTemplateId) && + (!criteria.trackId || criteria.trackId === e.trackId) && + (!criteria.isDefault || criteria.isDefault === e.isDefault)) return records } @@ -26,10 +28,26 @@ searchChallengeTimelineTemplates.schema = { criteria: Joi.object().keys({ typeId: Joi.optionalId(), trackId: Joi.optionalId(), - timelineTemplateId: Joi.optionalId() + timelineTemplateId: Joi.optionalId(), + isDefault: Joi.boolean() }) } +/** + * Unset existing default timeline template in order to create a new one + * @param {String} typeId the type ID + * @param {String} trackId the track ID + */ +async function unsetDefaultTimelineTemplate (typeId, trackId) { + const records = await searchChallengeTimelineTemplates({ typeId, trackId, isDefault: true }) + if (records.length === 0) { + return + } + for (const record of records) { + await fullyUpdateChallengeTimelineTemplate(record.id, { ...record, isDefault: false }) + } +} + /** * Create challenge type timeline template. * @param {Object} data the data to create challenge type timeline template @@ -46,6 +64,10 @@ async function createChallengeTimelineTemplate (data) { await helper.getById('ChallengeTrack', data.trackId) await helper.getById('TimelineTemplate', data.timelineTemplateId) + if (data.isDefault) { + await unsetDefaultTimelineTemplate(data.typeId, data.trackId) + } + const ret = await helper.create('ChallengeTimelineTemplate', _.assign({ id: uuid() }, data)) // post bus event await helper.postBusEvent(constants.Topics.ChallengeTimelineTemplateCreated, ret) @@ -56,7 +78,8 @@ createChallengeTimelineTemplate.schema = { data: Joi.object().keys({ typeId: Joi.id(), trackId: Joi.id(), - timelineTemplateId: Joi.id() + timelineTemplateId: Joi.id(), + isDefault: Joi.boolean().default(false).required() }).required() } @@ -84,7 +107,8 @@ async function fullyUpdateChallengeTimelineTemplate (challengeTimelineTemplateId if (record.typeId === data.typeId && record.trackId === data.trackId && - record.timelineTemplateId === data.timelineTemplateId) { + record.timelineTemplateId === data.timelineTemplateId && + record.isDefault === data.isDefault) { // no change return record } @@ -99,6 +123,10 @@ async function fullyUpdateChallengeTimelineTemplate (challengeTimelineTemplateId await helper.getById('ChallengeTrack', data.trackId) await helper.getById('TimelineTemplate', data.timelineTemplateId) + if (data.isDefault) { + await unsetDefaultTimelineTemplate(data.typeId, data.trackId) + } + const ret = await helper.update(record, data) // post bus event await helper.postBusEvent(constants.Topics.ChallengeTimelineTemplateUpdated, ret)