@@ -53,6 +53,7 @@ function getErrorWithStatus (message, statusCode) {
5353/**
5454 * Get challenge by id
5555 * @param challengeId the challenge id
56+ * @returns {object } challenge
5657 */
5758async function getChallenge ( challengeId ) {
5859 const url = `${ config . CHALLENGE_API_URL } /${ challengeId } `
@@ -76,30 +77,64 @@ async function getChallenge (challengeId) {
7677 }
7778}
7879
80+ /**
81+ * Get challenge by id from Schedule Api
82+ * @param challengeId the challenge id
83+ * @returns {Array } array of events
84+ */
85+ async function getEventsFromScheduleApi ( challengeId ) {
86+ const url = `${ config . SCHEDULE_API_URL } ?externalId=${ challengeId } `
87+
88+ logger . debug ( `request GET ${ url } ` )
89+ try {
90+ const res = await axios . get ( url )
91+ return res . data || [ ]
92+ } catch ( err ) {
93+ return [ ]
94+ }
95+ }
96+
7997/**
8098 * Create events from challenge object
8199 * @param challenge the challenge object
82100 */
83101function getEventsFromPhases ( challenge ) {
84102 const events = [ ]
85- // for each phase, create 2 events for the scheduledStartDate and scheduledEndDate respectively
103+ const dateBasedEvents = { }
104+
86105 for ( const phase of challenge . phases ) {
87- const event = {
88- phaseId : phase . phaseId ,
89- challengeId : challenge . id
106+ if ( ! dateBasedEvents [ phase . scheduledStartDate ] ) {
107+ dateBasedEvents [ phase . scheduledStartDate ] = [ ]
108+ }
109+ if ( ! dateBasedEvents [ phase . scheduledEndDate ] ) {
110+ dateBasedEvents [ phase . scheduledEndDate ] = [ ]
111+ }
112+ if ( new Date ( phase . scheduledEndDate ) . getTime ( ) >= Date . now ( ) && ! phase . isOpen ) {
113+ dateBasedEvents [ phase . scheduledStartDate ] . push ( {
114+ phaseId : phase . phaseId ,
115+ isOpen : true
116+ } )
117+ }
118+ if ( new Date ( phase . scheduledStartDate ) . getTime ( ) <= Date . now ( ) && phase . isOpen ) {
119+ dateBasedEvents [ phase . scheduledEndDate ] . push ( {
120+ phaseId : phase . phaseId ,
121+ isOpen : false
122+ } )
90123 }
91-
92- events . push ( {
93- ...event ,
94- status : 'starting' ,
95- scheduleTime : phase . scheduledStartDate
96- } )
97- events . push ( {
98- ...event ,
99- status : 'closing' ,
100- scheduleTime : phase . scheduledEndDate
101- } )
102124 }
125+
126+ _ . each ( dateBasedEvents , ( eventData , scheduleTime ) => {
127+ if ( eventData . length > 0 ) {
128+ events . push ( {
129+ externalId : challenge . id ,
130+ scheduleTime,
131+ payload : {
132+ phases : eventData
133+ }
134+ } )
135+ }
136+ } )
137+
103138 return events
104139}
105140
@@ -111,39 +146,59 @@ async function createEventsInExecutor (events) {
111146 const url = config . SCHEDULE_API_URL
112147 const token = await getTopcoderM2Mtoken ( )
113148
114- try {
115- for ( const event of events ) {
149+ for ( const event of events ) {
150+ try {
116151 // schedule executor api payload
117152 const executorPayload = {
118- url : `${ config . CHALLENGE_API_URL } /${ event . challengeId } ` ,
153+ url : `${ config . CHALLENGE_API_URL } /${ event . externalId } ` ,
154+ externalId : event . externalId ,
119155 method : 'patch' ,
120156 scheduleTime : event . scheduleTime ,
121157 headers : {
122158 'content-type' : 'application/json' ,
123159 Authorization : `Bearer ${ token } `
124160 } ,
125- payload : JSON . stringify ( {
126- phases : [ {
127- phaseId : event . phaseId ,
128- isOpen : event . status === 'starting'
129- } ]
130- } )
161+ payload : JSON . stringify ( event . payload )
131162 }
132163
133164 // call executor api
134165 logger . debug ( `request POST ${ url } ` )
135166 await axios . post ( `${ url } ` , executorPayload )
167+ } catch ( err ) {
168+ logger . warn ( `Failed to create event for external ID ${ event . externalId } ` )
169+ logger . error ( err . message )
170+ }
171+ }
172+ }
173+
174+ /**
175+ * Delete events in executor app
176+ * @param events the events array
177+ */
178+ async function deleteEventsInExecutor ( events ) {
179+ const url = config . SCHEDULE_API_URL
180+ for ( const event of events ) {
181+ // schedule executor api payload
182+ const executorPayload = {
183+ id : event . id
184+ }
185+ try {
186+ // call executor api
187+ logger . debug ( `request DELETE ${ url } ` )
188+ await axios . delete ( `${ url } ` , { data : executorPayload } )
189+ } catch ( err ) {
190+ logger . warn ( `Failed to delete event ${ event . id } ` )
191+ logger . error ( err . message )
136192 }
137- } catch ( err ) {
138- logger . error ( err . message )
139- throw err
140193 }
141194}
142195
143196module . exports = {
144197 getKafkaOptions,
145198 getTopcoderM2Mtoken,
146199 getChallenge,
200+ getEventsFromScheduleApi,
147201 getEventsFromPhases,
148- createEventsInExecutor
202+ createEventsInExecutor,
203+ deleteEventsInExecutor
149204}
0 commit comments