diff --git a/config/default.js b/config/default.js index 2a0d6e5..7f4ef0c 100755 --- a/config/default.js +++ b/config/default.js @@ -20,6 +20,7 @@ module.exports = { GROUP_IDS: process.env.GROUP_IDS || '202343,20000000', // Comma separated string of Group IDs SUBMISSION_API_URL: process.env.SUBMISSION_API_URL || 'https://api.topcoder-dev.com/v5/submissions', + REVIEW_SUMMATION_API_URL: process.env.REVIEW_SUMMATION_API_URL || 'https://api.topcoder-dev.com/v5/reviewSummations', CHALLENGE_API_URL: process.env.CHALLENGE_API_URL || 'https://api.topcoder-dev.com/v3/challenges', MEMBER_API_URL: process.env.MEMBER_API_URL || 'https://api.topcoder-dev.com/v3/users', diff --git a/src/models/Leaderboard.js b/src/models/Leaderboard.js index 4932698..fd0d8d3 100755 --- a/src/models/Leaderboard.js +++ b/src/models/Leaderboard.js @@ -10,7 +10,8 @@ const LeaderboardSchema = new Schema({ challengeId: { type: String }, memberId: { type: String }, handle: { type: String }, - aggregateScore: { type: Number } + aggregateScore: { type: Number }, + testsPassed: { type: Number } }) module.exports = { diff --git a/src/services/ProcessorService.js b/src/services/ProcessorService.js index 619335c..04c1149 100755 --- a/src/services/ProcessorService.js +++ b/src/services/ProcessorService.js @@ -8,18 +8,41 @@ const logger = require('../common/logger') const helper = require('../common/helper') const { Leaderboard } = require('../models') +/** + * Returns the tests passed using the metadata information + * @param {object} metadata the object from which to retrieve the tests passed + */ +function getTestsPassed (metadata = {}) { + const tests = metadata.tests || {} + + let testsPassed = tests.total - tests.pending - tests.failed + + if (!testsPassed) { + testsPassed = 0 + } + + return testsPassed +} + /** * Handle create / update topic messages from Kafka queue * @param {Object} message the Kafka message in JSON format */ const upsert = async (message) => { - // const existRecord = await Leaderboard.findOne({$and: [{challengeId: }]}) - const submission = await helper.reqToAPI(`${config.SUBMISSION_API_URL}/${message.payload.submissionId}`) - // const existRecord = await Leaderboard.findOne({ reviewSummationId: message.payload.id }) const existRecord = await Leaderboard.findOne({$and: [{challengeId: submission.body.challengeId}, {memberId: submission.body.memberId}]}) + const reviewSummation = await helper.reqToAPI(`${config.REVIEW_SUMMATION_API_URL}/${message.payload.id}`) + + let testsPassed + + if (reviewSummation.metadata) { + testsPassed = getTestsPassed(reviewSummation.metadata) + } else { + testsPassed = 0 + } + if (existRecord) { logger.debug(`Record with ID # ${message.payload.id} exists in database. Updating the score`) await Leaderboard.updateOne( @@ -29,13 +52,14 @@ const upsert = async (message) => { { $set: { aggregateScore: message.payload.aggregateScore, - reviewSummationId: message.payload.id + reviewSummationId: message.payload.id, + testsPassed } } ) } else { logger.debug(`Record with ID # ${message.payload.id} does not exists in database. Creating the record`) - // const submission = await helper.reqToAPI(`${config.SUBMISSION_API_URL}/${message.payload.submissionId}`) + const challengeDetail = await helper.reqToAPI(`${config.CHALLENGE_API_URL}?filter=id=${submission.body.challengeId}`) if (!helper.isGroupIdValid(challengeDetail.body.result.content[0].groupIds)) { @@ -53,7 +77,8 @@ const upsert = async (message) => { memberId: submission.body.memberId, challengeId: submission.body.challengeId, handle: memberDetail.body.result.content[0].handle, - aggregateScore: message.payload.aggregateScore + aggregateScore: message.payload.aggregateScore, + testsPassed } await Leaderboard.create(record)