Skip to content

Prod release #304

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Apr 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 46 additions & 61 deletions src/common/helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -301,29 +301,51 @@ function * getM2Mtoken () {
}

/**
* Get legacy challenge id if the challenge id is uuid form
* @param {String} challengeId Challenge ID
* @returns {String} Legacy Challenge ID of the given challengeId
* Function to get challenge by id
* @param {String} challengeId Challenge id
* @returns {Promise}
*/
function * getLegacyChallengeId (challengeId) {
function * getChallenge (challengeId) {
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(challengeId)) {
logger.debug(`${challengeId} detected as uuid. Fetching legacy challenge id`)
const token = yield getM2Mtoken()
try {
const response = yield request.get(`${config.CHALLENGEAPI_V5_URL}/${challengeId}`)
.set('Authorization', `Bearer ${token}`)
.set('Content-Type', 'application/json')
if (_.get(response.body, 'legacy.pureV5')) {
// pure V5 challenges don't have a legacy ID
return null
}
const legacyId = parseInt(response.body.legacyId, 10)
logger.debug(`Legacy challenge id is ${legacyId} for v5 challenge id ${challengeId}`)
return legacyId
return response.body
} catch (err) {
logger.error(`Error while accessing ${config.CHALLENGEAPI_V5_URL}/${challengeId}`)
throw err
}
} else {
logger.debug(`${challengeId} detected as legacy challenge id. Fetching legacy challenge id`)
const token = yield getM2Mtoken()
try {
const response = yield request.get(`${config.CHALLENGEAPI_V5_URL}?legacyId=${challengeId}`)
.set('Authorization', `Bearer ${token}`)
.set('Content-Type', 'application/json')
return response.body[0]
} catch (err) {
logger.error(`Error while accessing ${config.CHALLENGEAPI_V5_URL}?legacyId=${challengeId}`)
throw err
}
}
}

/**
* Get legacy challenge id if the challenge id is uuid form
* @param {String} challengeId Challenge ID
* @returns {String} Legacy Challenge ID of the given challengeId
*/
function * getLegacyChallengeId (challengeId) {
if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(challengeId)) {
const challenge = yield getChallenge(challengeId)
if (_.get(challenge, 'legacy.pureV5')) {
return null
}
const legacyId = parseInt(challenge.legacyId, 10)
return legacyId
}
return challengeId
}
Expand All @@ -335,47 +357,21 @@ function * getLegacyChallengeId (challengeId) {
*/
function * getV5ChallengeId (challengeId) {
if (!(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(challengeId))) {
logger.debug(`${challengeId} detected as legacy challenge id. Fetching legacy challenge id`)
const token = yield getM2Mtoken()
try {
const response = yield request.get(`${config.CHALLENGEAPI_V5_URL}?legacyId=${challengeId}`)
.set('Authorization', `Bearer ${token}`)
.set('Content-Type', 'application/json')
const v5Uuid = _.get(response, 'body[0].id')
logger.debug(`V5 challenge id is ${v5Uuid} for legacy challenge id ${challengeId}`)
return v5Uuid
} catch (err) {
logger.error(`Error while accessing ${config.CHALLENGEAPI_V5_URL}?legacyId=${challengeId}`)
throw err
}
const challenge = yield getChallenge(challengeId)
return challenge.id
}
return challengeId
}

/*
/**
* Get submission phase ID of a challenge from Challenge API
* @param challengeId Challenge ID
* @param challenge Challenge
* @returns {Integer} Submission phase ID of the given challengeId
*/
function * getSubmissionPhaseId (challengeId) {
function getSubmissionPhaseId (challenge) {
let phaseId = null
let response
challengeId = yield getV5ChallengeId(challengeId)

try {
logger.info(`Calling to challenge API to find submission phase Id for ${challengeId}`)
const token = yield getM2Mtoken()
response = yield request.get(`${config.CHALLENGEAPI_V5_URL}/${challengeId}`)
.set('Authorization', `Bearer ${token}`)
.set('Content-Type', 'application/json')
logger.info(`returned from finding submission phase Id for ${challengeId}`)
} catch (ex) {
logger.error(`Error while accessing ${config.CHALLENGEAPI_V5_URL}/${challengeId}`)
logger.debug('Setting submissionPhaseId to Null')
response = null
}
if (response) {
const phases = _.get(response.body, 'phases', [])
if (challenge) {
const phases = _.get(challenge, 'phases', [])
const checkPoint = _.filter(phases, { name: 'Checkpoint Submission', isOpen: true })
const submissionPh = _.filter(phases, { name: 'Submission', isOpen: true })
const finalFixPh = _.filter(phases, { name: 'Final Fix', isOpen: true })
Expand All @@ -393,14 +389,14 @@ function * getSubmissionPhaseId (challengeId) {
return phaseId
}

/*
/**
* Function to check user access to create a submission
* @param authUser Authenticated user
* @param subEntity Submission Entity
* @param challengeDetails Challenge
* @returns {Promise}
*/
function * checkCreateAccess (authUser, subEntity) {
let challengeDetails
function * checkCreateAccess (authUser, subEntity, challengeDetails) {
let resources

const challengeId = yield getV5ChallengeId(subEntity.challengeId)
Expand All @@ -412,18 +408,6 @@ function * checkCreateAccess (authUser, subEntity) {

const token = yield getM2Mtoken()

try {
logger.info(`Calling to challenge API for fetch phases and winners for ${challengeId}`)
challengeDetails = yield request.get(`${config.CHALLENGEAPI_V5_URL}/${challengeId}`)
.set('Authorization', `Bearer ${token}`)
.set('Content-Type', 'application/json')
logger.info(`returned for ${challengeId} with ${JSON.stringify(challengeDetails)}`)
} catch (ex) {
logger.error(`Error while accessing ${config.CHALLENGEAPI_V5_URL}/${challengeId}`)
logger.error(ex)
throw new errors.HttpStatusError(503, `Could not fetch details of challenge with id ${challengeId}`)
}

try {
resources = yield request.get(`${config.RESOURCEAPI_V5_BASE_URL}/resources?challengeId=${challengeId}`)
.set('Authorization', `Bearer ${token}`)
Expand Down Expand Up @@ -451,7 +435,7 @@ function * checkCreateAccess (authUser, subEntity) {
})

// Get phases and winner detail from challengeDetails
const phases = challengeDetails.body.phases
const { phases } = challengeDetails

// Check if the User is assigned as the reviewer for the contest
const reviewers = _.filter(currUserRoles, { role: 'Reviewer' })
Expand All @@ -471,7 +455,7 @@ function * checkCreateAccess (authUser, subEntity) {
throw new errors.HttpStatusError(403, `Register for the contest before you can submit`)
}

const submissionPhaseId = yield getSubmissionPhaseId(subEntity.challengeId)
const submissionPhaseId = yield getSubmissionPhaseId(challengeDetails)

if (submissionPhaseId == null) {
throw new errors.HttpStatusError(403, 'You cannot create a submission in the current phase')
Expand Down Expand Up @@ -912,6 +896,7 @@ module.exports = {
cleanseReviews,
getRoleIdToRoleNameMap,
getV5ChallengeId,
getChallenge,
adjustSubmissionChallengeId,
getLatestChallenges,
getLegacyScoreCardId
Expand Down
25 changes: 21 additions & 4 deletions src/services/SubmissionService.js
Original file line number Diff line number Diff line change
Expand Up @@ -281,10 +281,19 @@ function * createSubmission (authUser, files, entity) {

// Submission api only works with legacy challenge id
// If it is a v5 challenge id, get the associated legacy challenge id
const challengeId = yield helper.getV5ChallengeId(entity.challengeId)
const legacyChallengeId = yield helper.getLegacyChallengeId(entity.challengeId)
const challenge = yield helper.getChallenge(entity.challengeId)
const {
id: challengeId,
status,
phases,
legacyId: legacyChallengeId
} = challenge
const currDate = (new Date()).toISOString()

if (status !== 'Active') {
throw new errors.HttpStatusError(400, 'Challenge is not active')
}

const item = {
id: submissionId,
type: entity.type,
Expand Down Expand Up @@ -313,7 +322,15 @@ function * createSubmission (authUser, files, entity) {
if (entity.submissionPhaseId) {
item.submissionPhaseId = entity.submissionPhaseId
} else {
item.submissionPhaseId = yield helper.getSubmissionPhaseId(entity.challengeId)
item.submissionPhaseId = helper.getSubmissionPhaseId(challenge)
}

if (item.submissionPhaseId) {
// make sure the phase is open
const openPhase = _.find(phases, { phaseId: item.submissionPhaseId, isOpen: true })
if (!openPhase) {
throw new errors.HttpStatusError(400, `The phase ${item.submissionPhaseId} is not open`)
}
}

if (entity.fileType) {
Expand All @@ -325,7 +342,7 @@ function * createSubmission (authUser, files, entity) {
logger.info('Check User access before creating the submission')
if (_.intersection(authUser.roles, ['Administrator', 'administrator']).length === 0 && !authUser.scopes) {
logger.info(`Calling checkCreateAccess for ${JSON.stringify(authUser)}`)
yield helper.checkCreateAccess(authUser, item)
yield helper.checkCreateAccess(authUser, item, challenge)

if (entity.submittedDate) {
throw new errors.HttpStatusError(403, 'You are not allowed to set the `submittedDate` attribute on a submission')
Expand Down