@@ -55,6 +55,49 @@ async function getDirectProjectId (m2mToken, projectId) {
5555 return response . body
5656}
5757
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+
58101/**
59102 * Construct DTO from Kafka message payload.
60103 * @param {Object } payload the Kafka message payload
@@ -71,8 +114,11 @@ async function parsePayload (payload, m2mToken, isCreated = true) {
71114 projectId = _ . get ( ( await getDirectProjectId ( m2mToken , payload . projectId ) ) , 'directProjectId' )
72115 if ( ! projectId ) throw new Error ( `Could not find Direct Project ID for Project ${ payload . projectId } ` )
73116 }
117+
118+ const legacyTrackInfo = await getLegacyTrackInformation ( _ . get ( payload , 'legacy.track' ) , payload . typeId , m2mToken )
119+
74120 const data = {
75- track : _ . get ( payload , 'legacy.track' ) , // FIXME: thomas
121+ ... legacyTrackInfo ,
76122 name : payload . name ,
77123 reviewType : _ . get ( payload , 'legacy.reviewType' ) ,
78124 projectId,
@@ -94,30 +140,6 @@ async function parsePayload (payload, m2mToken, isCreated = true) {
94140 data . submissionVisibility = true
95141 data . milestoneId = 1
96142 }
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- }
121143 if ( payload . description ) {
122144 try {
123145 data . detailedRequirements = converter . makeHtml ( payload . description )
@@ -331,7 +353,7 @@ async function processUpdate (message) {
331353 if ( message . payload . status === constants . challengeStatuses . Completed && challenge . currentStatus !== constants . challengeStatuses . Completed ) {
332354 const challengeUuid = message . payload . id
333355 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 ) {
335357 logger . info ( 'Challenge type is TASK' )
336358 if ( ! message . payload . winners || message . payload . winners . length === 0 ) {
337359 throw new Error ( 'Cannot close challenge without winners' )
0 commit comments