@@ -55,6 +55,49 @@ async function getDirectProjectId (m2mToken, projectId) {
55
55
return response . body
56
56
}
57
57
58
+ /**
59
+ * Get legacy challenge track and subTrack values based on the v5 legacy.track and typeId
60
+ * @param {String } legacyTrack the legacy.track value from the v5 challenge object
61
+ * @param {String } typeId the v5 type ID
62
+ * @param {String } m2mToken the M2M token
63
+ */
64
+ async function getLegacyTrackInformation ( legacyTrack , typeId , m2mToken ) {
65
+ const data = {
66
+ track : _ . toUpper ( legacyTrack )
67
+ }
68
+ if ( _ . isUndefined ( data . track ) ) {
69
+ throw new Error ( `Cannot create a challenge without a track. Please use one of [${ _ . values ( constants . challengeTracks ) . join ( ', ' ) } ]` )
70
+ }
71
+ if ( _ . isUndefined ( typeId ) ) {
72
+ throw new Error ( 'Cannot create a challenge without a typeId.' )
73
+ }
74
+
75
+ // Use the configured subTrack if set for the given track/typeId
76
+ if ( constants . legacySubTrackMapping [ _ . toLower ( legacyTrack ) ] && constants . legacySubTrackMapping [ _ . toLower ( legacyTrack ) ] [ typeId ] ) {
77
+ data . subTrack = constants . legacySubTrackMapping [ _ . toLower ( legacyTrack ) ] [ typeId ]
78
+ } else {
79
+ // otherwise fetch v4 challenge type based on the v5 type.legacyId
80
+ const v5Type = await helper . getRequest ( `${ config . V5_CHALLENGE_TYPE_API_URL } /${ typeId } ` , m2mToken )
81
+ const v4TypeList = await helper . getRequest ( `${ config . V4_CHALLENGE_TYPE_API_URL } ` , m2mToken )
82
+ const v4Type = _ . find ( _ . get ( v4TypeList , 'body.result.content' , [ ] ) , type => type . id === v5Type . body . legacyId )
83
+ if ( ! v4Type ) {
84
+ throw new Error ( `There is no mapping between v5 Type ${ v5Type . body . name } and V4` )
85
+ }
86
+ data . subTrack = v4Type . subTrack
87
+ data . legacyTypeId = v5Type . body . legacyId
88
+ }
89
+
90
+ // If it's a private task, set the `task` property to `true`
91
+ if ( typeId === constants . challengeTypes . TASK_TYPE_ID ) {
92
+ // Tasks can only be created for the develop and design tracks
93
+ if ( data . track !== constants . challengeTracks . DEVELOP && data . track !== constants . challengeTracks . DESIGN ) {
94
+ throw new Error ( `Cannot create a task for track ${ data . track } ` )
95
+ }
96
+ data . task = true
97
+ }
98
+ return data
99
+ }
100
+
58
101
/**
59
102
* Construct DTO from Kafka message payload.
60
103
* @param {Object } payload the Kafka message payload
@@ -71,8 +114,11 @@ async function parsePayload (payload, m2mToken, isCreated = true) {
71
114
projectId = _ . get ( ( await getDirectProjectId ( m2mToken , payload . projectId ) ) , 'directProjectId' )
72
115
if ( ! projectId ) throw new Error ( `Could not find Direct Project ID for Project ${ payload . projectId } ` )
73
116
}
117
+
118
+ const legacyTrackInfo = await getLegacyTrackInformation ( _ . get ( payload , 'legacy.track' ) , payload . typeId , m2mToken )
119
+
74
120
const data = {
75
- track : _ . get ( payload , 'legacy.track' ) , // FIXME: thomas
121
+ ... legacyTrackInfo ,
76
122
name : payload . name ,
77
123
reviewType : _ . get ( payload , 'legacy.reviewType' ) ,
78
124
projectId,
@@ -94,30 +140,6 @@ async function parsePayload (payload, m2mToken, isCreated = true) {
94
140
data . submissionVisibility = true
95
141
data . milestoneId = 1
96
142
}
97
- if ( payload . typeId ) {
98
- const v5Type = await helper . getRequest ( `${ config . V5_CHALLENGE_TYPE_API_URL } /${ payload . typeId } ` , m2mToken )
99
- const v4TypeList = await helper . getRequest ( `${ config . V4_CHALLENGE_TYPE_API_URL } ` , m2mToken )
100
- const v4Type = _ . find ( _ . get ( v4TypeList , 'body.result.content' , [ ] ) , type => type . id === v5Type . body . legacyId )
101
- if ( ! v4Type ) {
102
- throw new Error ( `There is no mapping between v5 Type ${ v5Type . body . name } and V4` )
103
- }
104
- data . subTrack = v4Type . subTrack
105
- // TASK is named as FIRST_2_FINISH on legacy
106
- if ( v5Type . body . abbreviation === constants . challengeAbbreviations . TASK ) {
107
- data . task = true
108
- switch ( _ . toLower ( _ . toString ( data . track ) ) ) {
109
- case 'develop' :
110
- data . subTrack = constants . challengeAbbreviations . FIRST_2_FINISH
111
- break
112
- case 'design' :
113
- data . subTrack = constants . challengeAbbreviations . DESIGN_FIRST_2_FINISH
114
- break
115
- default :
116
- throw new Error ( `Cannot create a task for track ${ data . track } ` )
117
- }
118
- }
119
- data . legacyTypeId = v5Type . body . legacyId
120
- }
121
143
if ( payload . description ) {
122
144
try {
123
145
data . detailedRequirements = converter . makeHtml ( payload . description )
@@ -331,7 +353,7 @@ async function processUpdate (message) {
331
353
if ( message . payload . status === constants . challengeStatuses . Completed && challenge . currentStatus !== constants . challengeStatuses . Completed ) {
332
354
const challengeUuid = message . payload . id
333
355
const v5Challenge = await helper . getRequest ( `${ config . V5_CHALLENGE_API_URL } /${ challengeUuid } ` , m2mToken )
334
- if ( v5Challenge . body . typeId === config . TASK_TYPE_ID ) {
356
+ if ( v5Challenge . body . typeId === constants . challengeTypes . TASK_TYPE_ID ) {
335
357
logger . info ( 'Challenge type is TASK' )
336
358
if ( ! message . payload . winners || message . payload . winners . length === 0 ) {
337
359
throw new Error ( 'Cannot close challenge without winners' )
0 commit comments