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

topcoder-x-ui/issues/453 #93

Merged
merged 1 commit into from
Jun 2, 2022
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
5 changes: 5 additions & 0 deletions models/Project.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ const schema = new Schema({
type: Number,
required: true
},
tags: {
type: Array,
required: true,
default: []
},
rocketChatWebhook: {type: String, required: false},
rocketChatChannelName: {type: String, required: false},
archived: {type: String, required: true},
Expand Down
65 changes: 65 additions & 0 deletions services/ChallengeService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Copyright (c) 2022 TopCoder, Inc. All rights reserved.
*/
'use strict';

/**
* This service processes incoming pure challenge events.
*
* @author TCSCODER
* @version 1.0
*/
const _ = require('lodash');
const Joi = require('joi');
const logger = require('../utils/logger');
const topcoderApiHelper = require('../utils/topcoder-api-helper');
const dbHelper = require('../utils/db-helper');

/**
* Update challenge tags
* @param {Object} event the event
*/
async handleChallengeTagsUpdate(event) {
const tags = event.data.tags;
try {
_.each(event.data.challengeUUIDsList, challengeUUIDs => {
if (_.isString(challengeUUIDs)) { // repoUrl
challengeUUIDs = await dbHelper.queryChallengeUUIDsByRepoUrl(challengeUUIDs);
}
_.each(challengeUUIDs, challengeUUID => await topcoderApiHelper.updateChallenge(challengeUUID, {tags}));
});
} catch (err) {
logger.error(`handleChallengeTagsUpdate failed. Internal Error: ${err}`);
throw new Error(`handleChallengeTagsUpdate failed. Internal Error: ${err}`);
}
}

/**
* Process pure challenge event.
* @param {Object} event the event
*/
async function process(event) {
Joi.attempt(event, process.schema);

if (event.event === 'challengeTags.update') {
await handleChallengeTagsUpdate(event);
}
}

process.schema = Joi.object().keys({
event: Joi.string().valid('challengeUUIDTags.update').required(),
data: Joi.object().keys({
challengeUUIDsList: Joi.array().items(
Joi.alternatives().try(Joi.string(), Joi.array().items(Joi.string()))
).required(),
tags: Joi.array().items(Joi.string().required()).min(1).required(),
}).required(),
retryCount: Joi.number().integer().default(0).optional(),
});


module.exports = {
process
};

logger.buildService(module.exports);
1 change: 1 addition & 0 deletions services/CopilotPaymentService.js
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ async function handlePaymentAdd(event, payment) {
const newChallenge = {
name: challengeTitle,
projectId: project.tcDirectId,
tags: project.tags,
detailedRequirements: challengeRequirements,
prizes: [payment.amount],
reviewType: 'INTERNAL'
Expand Down
1 change: 1 addition & 0 deletions services/IssueService.js
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,7 @@ async function handleIssueCreate(event, issue, forceAssign = false) {
issue.challengeUUID = await topcoderApiHelper.createChallenge({
name: issue.title,
projectId,
tags: project.tags,
detailedRequirements: issue.body,
prizes: issue.prizes
});
Expand Down
19 changes: 19 additions & 0 deletions utils/db-helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,24 @@ async function queryOneActiveRepository(model, url) {
});
}

/**
* Get Issue's challengeUUID by repoUrl
* @param {String} repoUrl The repo url
* @returns {Promise<Object>}
*/
async function queryChallengeUUIDsByRepoUrl(repoUrl) {
return await new Promise((resolve, reject) => {
models.Issue.scan('repoUrl').eq(repoUrl)
.attributes(['challengeUUID'])
.exec((err, results) => {
if (err) {
return reject(err);
}
return resolve(results.map({challengeUUID} => challengeUUID));
});
});
}

module.exports = {
getById,
scan,
Expand All @@ -357,6 +375,7 @@ module.exports = {
queryOneUserMappingByGithubUsername,
queryOneUserMappingByGitlabUsername,
queryOneUserMappingByTCUsername,
queryChallengeUUIDsByRepoUrl,
removeCopilotPayment,
removeIssue
};
7 changes: 7 additions & 0 deletions utils/kafka-consumer.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const _ = require('lodash');
const healthcheck = require('topcoder-healthcheck-dropin');
const IssueService = require('../services/IssueService');
const CopilotPaymentService = require('../services/CopilotPaymentService');
const ChallengeService = require('../services/ChallengeService');
const logger = require('./logger');
const kafka = require('./kafka');

Expand Down Expand Up @@ -47,6 +48,12 @@ function messageHandler(messageSet) {
.process(event)
.catch(logger.error);
}
if (event && _.includes(['challengeUUIDTags.update']
, event.event)) {
ChallengeService
.process(event)
.catch(logger.error);
}
});
}

Expand Down