@@ -41,6 +41,17 @@ async function getPlatforms (m2mToken) {
41
41
*/
42
42
async function getChallengeById ( m2mToken , legacyId ) {
43
43
const response = await helper . getRequest ( `${ config . V4_CHALLENGE_API_URL } /${ legacyId } ` , m2mToken )
44
+ return _ . get ( response , 'body.result.content[0]' )
45
+ }
46
+
47
+ /**
48
+ * Get Project from V5 API
49
+ * @param {String } m2mToken token for accessing the API
50
+ * @param {Number } projectId project id
51
+ * @returns {Object } project response body
52
+ */
53
+ async function getDirectProjectId ( m2mToken , projectId ) {
54
+ const response = await helper . getRequest ( `${ config . V5_PROJECTS_API_URL } /${ projectId } ` , m2mToken )
44
55
return response . body
45
56
}
46
57
@@ -53,29 +64,36 @@ async function getChallengeById (m2mToken, legacyId) {
53
64
*/
54
65
async function parsePayload ( payload , m2mToken , isCreated = true ) {
55
66
try {
67
+ let projectId
68
+ if ( _ . get ( payload , 'legacy.directProjectId' ) ) {
69
+ projectId = payload . legacy . directProjectId
70
+ } else {
71
+ projectId = _ . get ( ( await getDirectProjectId ( m2mToken , payload . projectId ) ) , 'directProjectId' )
72
+ if ( ! projectId ) throw new Error ( `Could not find Direct Project ID for Project ${ payload . projectId } ` )
73
+ }
56
74
const data = {
57
- track : payload . track , // FIXME: thomas
75
+ track : _ . get ( payload , 'legacy .track' ) , // FIXME: thomas
58
76
name : payload . name ,
59
- reviewType : payload . reviewType ,
60
- projectId : payload . projectId ,
77
+ reviewType : _ . get ( payload , 'legacy .reviewType' ) ,
78
+ projectId,
61
79
status : payload . status
62
80
}
63
- if ( payload . forumId ) {
64
- data . forumId = payload . forumId
81
+ if ( _ . get ( payload , 'legacy .forumId' ) ) {
82
+ data . forumId = payload . legacy . forumId
65
83
}
66
84
if ( payload . copilotId ) {
67
85
data . copilotId = payload . copilotId
68
86
}
69
87
if ( isCreated ) {
70
88
// hard code some required properties for v4 api
71
- data . confidentialityType = ' public'
89
+ data . confidentialityType = _ . get ( payload , 'legacy.confidentialityType' , ' public')
72
90
data . submissionGuidelines = 'Please read above'
73
91
data . submissionVisibility = true
74
92
data . milestoneId = 1
75
93
}
76
94
if ( payload . typeId ) {
77
95
const typeRes = await helper . getRequest ( `${ config . V5_CHALLENGE_TYPE_API_URL } /${ payload . typeId } ` , m2mToken )
78
- data . subTrack = typeRes . body . name // FIXME: thomas
96
+ data . subTrack = typeRes . body . abbreviation // FIXME: thomas
79
97
data . legacyTypeId = typeRes . body . legacyId
80
98
}
81
99
if ( payload . description ) {
@@ -93,16 +111,16 @@ async function parsePayload (payload, m2mToken, isCreated = true) {
93
111
}
94
112
}
95
113
if ( payload . phases ) {
96
- const registrationPhase = _ . find ( payload . phases , p => p . name . toLowerCase ( ) === constants . phaseTypes . registration )
97
- const submissionPhase = _ . find ( payload . phases , p => p . name . toLowerCase ( ) === constants . phaseTypes . submission )
114
+ const registrationPhase = _ . find ( payload . phases , p => p . phaseId === config . REGISTRATION_PHASE_ID )
115
+ const submissionPhase = _ . find ( payload . phases , p => p . phaseId === config . SUBMISSION_PHASE_ID )
98
116
data . registrationStartsAt = new Date ( ) . toISOString ( )
99
117
data . registrationEndsAt = new Date ( Date . now ( ) + registrationPhase . duration ) . toISOString ( )
100
118
data . registrationDuration = registrationPhase . duration
101
119
data . submissionEndsAt = new Date ( Date . now ( ) + submissionPhase . duration ) . toISOString ( )
102
120
data . submissionDuration = submissionPhase . duration
103
121
104
122
// Only Design can have checkpoint phase and checkpoint prizes
105
- const checkpointPhase = _ . find ( payload . phases , p => p . name . toLowerCase ( ) === constants . phaseTypes . checkpoint )
123
+ const checkpointPhase = _ . find ( payload . phases , p => p . phaseId === config . CHECKPOINT_SUBMISSION_PHASE_ID )
106
124
if ( checkpointPhase ) {
107
125
data . checkpointSubmissionStartsAt = new Date ( ) . toISOString ( )
108
126
data . checkpointSubmissionEndsAt = new Date ( Date . now ( ) + checkpointPhase . duration ) . toISOString ( )
@@ -163,6 +181,10 @@ async function parsePayload (payload, m2mToken, isCreated = true) {
163
181
* @param {Object } message the kafka message
164
182
*/
165
183
async function processCreate ( message ) {
184
+ if ( message . payload . status === constants . challengeStatuses . New ) {
185
+ logger . debug ( `Will skip creating on legacy as status is ${ constants . challengeStatuses . New } ` )
186
+ return
187
+ }
166
188
const m2mToken = await helper . getM2MToken ( )
167
189
168
190
const saveDraftContestDTO = await parsePayload ( message . payload , m2mToken )
@@ -172,7 +194,15 @@ async function processCreate (message) {
172
194
logger . debug ( 'processCreate :: beforeTry' )
173
195
try {
174
196
const newChallenge = await helper . postRequest ( `${ config . V4_CHALLENGE_API_URL } ` , { param : saveDraftContestDTO } , m2mToken )
175
- await helper . patchRequest ( `${ config . V5_CHALLENGE_API_URL } /${ challengeUuid } ` , { legacyId : newChallenge . body . result . content . id } , m2mToken )
197
+ await helper . patchRequest ( `${ config . V5_CHALLENGE_API_URL } /${ challengeUuid } ` , {
198
+ legacy : {
199
+ ...message . payload . legacy ,
200
+ directProjectId : newChallenge . body . result . content . projectId ,
201
+ forumId : _ . get ( newChallenge , 'body.result.content.forumId' , message . payload . legacy . forumId ) ,
202
+ informixModified : _ . get ( newChallenge , 'body.result.content.updatedAt' , new Date ( ) )
203
+ } ,
204
+ legacyId : newChallenge . body . result . content . id
205
+ } , m2mToken )
176
206
logger . debug ( 'End of processCreate' )
177
207
} catch ( e ) {
178
208
logger . error ( 'processCreate Catch' , e )
@@ -188,26 +218,29 @@ processCreate.schema = {
188
218
'mime-type' : Joi . string ( ) . required ( ) ,
189
219
payload : Joi . object ( ) . keys ( {
190
220
id : Joi . string ( ) . required ( ) ,
191
- typeId : Joi . string ( ) . required ( ) ,
192
- track : Joi . string ( ) . required ( ) ,
221
+ typeId : Joi . string ( ) ,
222
+ legacy : Joi . object ( ) . keys ( {
223
+ track : Joi . string ( ) . required ( ) ,
224
+ reviewType : Joi . string ( ) . required ( ) ,
225
+ confidentialityType : Joi . string ( ) ,
226
+ directProjectId : Joi . number ( ) ,
227
+ forumId : Joi . number ( ) . integer ( ) . positive ( )
228
+ } ) ,
193
229
name : Joi . string ( ) . required ( ) ,
194
- description : Joi . string ( ) . required ( ) ,
230
+ description : Joi . string ( ) ,
195
231
privateDescription : Joi . string ( ) ,
196
232
phases : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
197
233
id : Joi . string ( ) . required ( ) ,
198
- name : Joi . string ( ) . required ( ) ,
199
234
duration : Joi . number ( ) . positive ( ) . required ( )
200
- } ) . unknown ( true ) ) . min ( 1 ) . required ( ) ,
235
+ } ) . unknown ( true ) ) ,
201
236
prizeSets : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
202
237
type : Joi . string ( ) . valid ( _ . values ( constants . prizeSetTypes ) ) . required ( ) ,
203
238
prizes : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
204
239
value : Joi . number ( ) . positive ( ) . required ( )
205
240
} ) . unknown ( true ) ) . min ( 1 ) . required ( )
206
- } ) . unknown ( true ) ) . min ( 1 ) . required ( ) ,
207
- reviewType : Joi . string ( ) . required ( ) ,
208
- tags : Joi . array ( ) . items ( Joi . string ( ) . required ( ) ) . min ( 1 ) . required ( ) , // tag names
241
+ } ) . unknown ( true ) ) ,
242
+ tags : Joi . array ( ) . items ( Joi . string ( ) . required ( ) ) , // tag names
209
243
projectId : Joi . number ( ) . integer ( ) . positive ( ) . required ( ) ,
210
- forumId : Joi . number ( ) . integer ( ) . positive ( ) ,
211
244
copilotId : Joi . number ( ) . integer ( ) . positive ( ) . optional ( ) ,
212
245
status : Joi . string ( ) . valid ( _ . values ( Object . keys ( constants . createChallengeStatusesMap ) ) ) . required ( )
213
246
} ) . unknown ( true ) . required ( )
@@ -219,24 +252,35 @@ processCreate.schema = {
219
252
* @param {Object } message the kafka message
220
253
*/
221
254
async function processUpdate ( message ) {
255
+ if ( message . payload . status === constants . challengeStatuses . New ) {
256
+ logger . debug ( `Will skip creating on legacy as status is ${ constants . challengeStatuses . New } ` )
257
+ return
258
+ } else if ( ! message . payload . legacyId ) {
259
+ logger . debug ( 'Legacy ID does not exist. Will create...' )
260
+ return processCreate ( message )
261
+ }
222
262
const m2mToken = await helper . getM2MToken ( )
223
263
224
264
const saveDraftContestDTO = await parsePayload ( message . payload , m2mToken , false )
225
265
logger . debug ( 'Parsed Payload' , saveDraftContestDTO )
226
266
try {
227
267
// ensure challenge existed
228
268
const challenge = await getChallengeById ( m2mToken , message . payload . legacyId )
229
- // we can't switch the challenge type
230
- if ( message . payload . track ) {
231
- const newTrack = message . payload . track
232
- // track information is stored in subTrack of V4 API
233
- if ( challenge . result . content . track !== newTrack ) {
234
- // refer ContestDirectManager.prepare in ap-challenge-microservice
235
- throw new Error ( 'You can\'t change challenge track' )
236
- }
269
+ if ( ! challenge ) {
270
+ throw new Error ( `Could not find challenge ${ message . payload . legacyId } ` )
237
271
}
272
+ // we can't switch the challenge type
273
+ // TODO: track is missing from the response.
274
+ // if (message.payload.legacy.track) {
275
+ // const newTrack = message.payload.legacy.track
276
+ // // track information is stored in subTrack of V4 API
277
+ // if (challenge.track !== newTrack) {
278
+ // // refer ContestDirectManager.prepare in ap-challenge-microservice
279
+ // throw new Error('You can\'t change challenge track')
280
+ // }
281
+ // }
238
282
239
- await helper . putRequest ( `${ config . V4_CHALLENGE_API_URL } /${ message . payload . legacyId } ` , { param : saveDraftContestDTO } )
283
+ await helper . putRequest ( `${ config . V4_CHALLENGE_API_URL } /${ message . payload . legacyId } ` , { param : saveDraftContestDTO } , m2mToken )
240
284
} catch ( e ) {
241
285
logger . error ( 'processUpdate Catch' , e )
242
286
throw e
@@ -250,27 +294,31 @@ processUpdate.schema = {
250
294
timestamp : Joi . date ( ) . required ( ) ,
251
295
'mime-type' : Joi . string ( ) . required ( ) ,
252
296
payload : Joi . object ( ) . keys ( {
253
- legacyId : Joi . number ( ) . integer ( ) . positive ( ) . required ( ) ,
297
+ legacyId : Joi . number ( ) . integer ( ) . positive ( ) ,
298
+ legacy : Joi . object ( ) . keys ( {
299
+ track : Joi . string ( ) . required ( ) ,
300
+ reviewType : Joi . string ( ) . required ( ) ,
301
+ confidentialityType : Joi . string ( ) ,
302
+ directProjectId : Joi . number ( ) ,
303
+ forumId : Joi . number ( ) . integer ( ) . positive ( ) ,
304
+ informixModified : Joi . string ( )
305
+ } ) ,
254
306
typeId : Joi . string ( ) ,
255
- track : Joi . string ( ) ,
256
307
name : Joi . string ( ) ,
257
308
description : Joi . string ( ) ,
258
309
privateDescription : Joi . string ( ) ,
259
310
phases : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
260
311
id : Joi . string ( ) . required ( ) ,
261
- name : Joi . string ( ) . required ( ) ,
262
312
duration : Joi . number ( ) . positive ( ) . required ( )
263
- } ) . unknown ( true ) ) . min ( 1 ) ,
313
+ } ) . unknown ( true ) ) ,
264
314
prizeSets : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
265
315
type : Joi . string ( ) . valid ( _ . values ( constants . prizeSetTypes ) ) . required ( ) ,
266
316
prizes : Joi . array ( ) . items ( Joi . object ( ) . keys ( {
267
317
value : Joi . number ( ) . positive ( ) . required ( )
268
- } ) . unknown ( true ) ) . min ( 1 ) . required ( )
318
+ } ) . unknown ( true ) )
269
319
} ) . unknown ( true ) ) . min ( 1 ) ,
270
- reviewType : Joi . string ( ) ,
271
320
tags : Joi . array ( ) . items ( Joi . string ( ) . required ( ) ) . min ( 1 ) , // tag names
272
- projectId : Joi . number ( ) . integer ( ) . positive ( ) ,
273
- forumId : Joi . number ( ) . integer ( ) . positive ( )
321
+ projectId : Joi . number ( ) . integer ( ) . positive ( ) . allow ( null )
274
322
} ) . unknown ( true ) . required ( )
275
323
} ) . required ( )
276
324
}
0 commit comments