From af42897d3076cc704f494924b1de9dcf6ed63706 Mon Sep 17 00:00:00 2001 From: 52code Date: Thu, 2 Jun 2022 12:15:45 +0800 Subject: [PATCH] https://github.com/topcoder-platform/topcoder-x-ui/issues/453 --- models/Project.js | 5 +++ services/ChallengeService.js | 65 +++++++++++++++++++++++++++++++ services/CopilotPaymentService.js | 1 + services/IssueService.js | 1 + utils/db-helper.js | 19 +++++++++ utils/kafka-consumer.js | 7 ++++ 6 files changed, 98 insertions(+) create mode 100644 services/ChallengeService.js diff --git a/models/Project.js b/models/Project.js index 08a7837..c27edc1 100755 --- a/models/Project.js +++ b/models/Project.js @@ -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}, diff --git a/services/ChallengeService.js b/services/ChallengeService.js new file mode 100644 index 0000000..f11f47f --- /dev/null +++ b/services/ChallengeService.js @@ -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); diff --git a/services/CopilotPaymentService.js b/services/CopilotPaymentService.js index edfe5a4..6e54afe 100644 --- a/services/CopilotPaymentService.js +++ b/services/CopilotPaymentService.js @@ -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' diff --git a/services/IssueService.js b/services/IssueService.js index e1d1cb7..0c309f3 100755 --- a/services/IssueService.js +++ b/services/IssueService.js @@ -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 }); diff --git a/utils/db-helper.js b/utils/db-helper.js index 38425b5..8775177 100644 --- a/utils/db-helper.js +++ b/utils/db-helper.js @@ -342,6 +342,24 @@ async function queryOneActiveRepository(model, url) { }); } +/** + * Get Issue's challengeUUID by repoUrl + * @param {String} repoUrl The repo url + * @returns {Promise} + */ +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, @@ -357,6 +375,7 @@ module.exports = { queryOneUserMappingByGithubUsername, queryOneUserMappingByGitlabUsername, queryOneUserMappingByTCUsername, + queryChallengeUUIDsByRepoUrl, removeCopilotPayment, removeIssue }; diff --git a/utils/kafka-consumer.js b/utils/kafka-consumer.js index 65fc9c4..d9eda8d 100644 --- a/utils/kafka-consumer.js +++ b/utils/kafka-consumer.js @@ -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'); @@ -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); + } }); }