Skip to content
This repository was archived by the owner on Jan 23, 2025. It is now read-only.

Commit 8b778cb

Browse files
Update logic for track/subTrack mapping
1 parent 6bc5d34 commit 8b778cb

File tree

3 files changed

+84
-32
lines changed

3 files changed

+84
-32
lines changed

config/default.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,5 @@ module.exports = {
4141
// PHASE IDs
4242
REGISTRATION_PHASE_ID: process.env.REGISTRATION_PHASE_ID || 'a93544bc-c165-4af4-b55e-18f3593b457a',
4343
SUBMISSION_PHASE_ID: process.env.SUBMISSION_PHASE_ID || '6950164f-3c5e-4bdc-abc8-22aaf5a1bd49',
44-
CHECKPOINT_SUBMISSION_PHASE_ID: process.env.CHECKPOINT_SUBMISSION_PHASE_ID || 'd8a2cdbe-84d1-4687-ab75-78a6a7efdcc8',
45-
46-
// Challenge Type IDs
47-
TASK_TYPE_ID: process.env.TASK_TYPE_ID || 'e885273d-aeda-42c0-917d-bfbf979afbba'
44+
CHECKPOINT_SUBMISSION_PHASE_ID: process.env.CHECKPOINT_SUBMISSION_PHASE_ID || 'd8a2cdbe-84d1-4687-ab75-78a6a7efdcc8'
4845
}

src/constants.js

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const _ = require('lodash')
2+
13
/**
24
* constants
35
*/
@@ -45,10 +47,38 @@ const challengeStatuses = {
4547
CancelledZeroRegistrations: 'Cancelled - Zero Registrations'
4648
}
4749

50+
const challengeTypes = {
51+
TASK_TYPE_ID: 'e885273d-aeda-42c0-917d-bfbf979afbba',
52+
CHALLENGE_TYPE_ID: '94eee466-9255-4b60-88d8-4f59c1810dd0',
53+
FIRST_2_FINISH_TYPE_ID: '6950164f-3c5e-4bdc-abc8-22aaf5a1bd49'
54+
}
55+
56+
const challengeTracks = {
57+
DEVELOP: 'DEVELOP',
58+
DESIGN: 'DESIGN',
59+
DATA_SCIENCE: 'DATA_SCIENCE',
60+
QA: 'QA'
61+
}
62+
4863
const challengeAbbreviations = {
4964
TASK: 'TASK',
5065
FIRST_2_FINISH: 'FIRST_2_FINISH',
51-
DESIGN_FIRST_2_FINISH: 'DESIGN_FIRST_2_FINISH'
66+
DESIGN_FIRST_2_FINISH: 'DESIGN_FIRST_2_FINISH',
67+
CODE: 'CODE',
68+
APPLICATION_FRONT_END_DESIGN: 'APPLICATION_FRONT_END_DESIGN'
69+
}
70+
71+
const legacySubTrackMapping = {
72+
[_.toLower(challengeTracks.DEVELOP)]: {
73+
[challengeTypes.TASK_TYPE_ID]: challengeAbbreviations.FIRST_2_FINISH,
74+
[challengeTypes.CHALLENGE_TYPE_ID]: challengeAbbreviations.CODE,
75+
[challengeTypes.FIRST_2_FINISH_TYPE_ID]: challengeAbbreviations.FIRST_2_FINISH
76+
},
77+
[_.toLower(challengeTracks.DESIGN)]: {
78+
[challengeTypes.TASK_TYPE_ID]: challengeAbbreviations.DESIGN_FIRST_2_FINISH,
79+
[challengeTypes.CHALLENGE_TYPE_ID]: challengeAbbreviations.APPLICATION_FRONT_END_DESIGN,
80+
[challengeTypes.FIRST_2_FINISH_TYPE_ID]: challengeAbbreviations.DESIGN_FIRST_2_FINISH
81+
}
5282
}
5383

5484
module.exports = {
@@ -57,5 +87,8 @@ module.exports = {
5787
EVENT_MIME_TYPE,
5888
createChallengeStatusesMap,
5989
challengeStatuses,
60-
challengeAbbreviations
90+
challengeAbbreviations,
91+
challengeTracks,
92+
legacySubTrackMapping,
93+
challengeTypes
6194
}

src/services/ProcessorService.js

Lines changed: 48 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)