@@ -18,18 +18,36 @@ const constants = require('../../app-constants')
1818async 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
2527searchChallengeTimelineTemplates . 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