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

Commit af42897

Browse files
committed
https://github.com/topcoder-platform/topcoder-x-ui/issues/453
1 parent 8e343f7 commit af42897

File tree

6 files changed

+98
-0
lines changed

6 files changed

+98
-0
lines changed

models/Project.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ const schema = new Schema({
2323
type: Number,
2424
required: true
2525
},
26+
tags: {
27+
type: Array,
28+
required: true,
29+
default: []
30+
},
2631
rocketChatWebhook: {type: String, required: false},
2732
rocketChatChannelName: {type: String, required: false},
2833
archived: {type: String, required: true},

services/ChallengeService.js

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Copyright (c) 2022 TopCoder, Inc. All rights reserved.
3+
*/
4+
'use strict';
5+
6+
/**
7+
* This service processes incoming pure challenge events.
8+
*
9+
* @author TCSCODER
10+
* @version 1.0
11+
*/
12+
const _ = require('lodash');
13+
const Joi = require('joi');
14+
const logger = require('../utils/logger');
15+
const topcoderApiHelper = require('../utils/topcoder-api-helper');
16+
const dbHelper = require('../utils/db-helper');
17+
18+
/**
19+
* Update challenge tags
20+
* @param {Object} event the event
21+
*/
22+
async handleChallengeTagsUpdate(event) {
23+
const tags = event.data.tags;
24+
try {
25+
_.each(event.data.challengeUUIDsList, challengeUUIDs => {
26+
if (_.isString(challengeUUIDs)) { // repoUrl
27+
challengeUUIDs = await dbHelper.queryChallengeUUIDsByRepoUrl(challengeUUIDs);
28+
}
29+
_.each(challengeUUIDs, challengeUUID => await topcoderApiHelper.updateChallenge(challengeUUID, {tags}));
30+
});
31+
} catch (err) {
32+
logger.error(`handleChallengeTagsUpdate failed. Internal Error: ${err}`);
33+
throw new Error(`handleChallengeTagsUpdate failed. Internal Error: ${err}`);
34+
}
35+
}
36+
37+
/**
38+
* Process pure challenge event.
39+
* @param {Object} event the event
40+
*/
41+
async function process(event) {
42+
Joi.attempt(event, process.schema);
43+
44+
if (event.event === 'challengeTags.update') {
45+
await handleChallengeTagsUpdate(event);
46+
}
47+
}
48+
49+
process.schema = Joi.object().keys({
50+
event: Joi.string().valid('challengeUUIDTags.update').required(),
51+
data: Joi.object().keys({
52+
challengeUUIDsList: Joi.array().items(
53+
Joi.alternatives().try(Joi.string(), Joi.array().items(Joi.string()))
54+
).required(),
55+
tags: Joi.array().items(Joi.string().required()).min(1).required(),
56+
}).required(),
57+
retryCount: Joi.number().integer().default(0).optional(),
58+
});
59+
60+
61+
module.exports = {
62+
process
63+
};
64+
65+
logger.buildService(module.exports);

services/CopilotPaymentService.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ async function handlePaymentAdd(event, payment) {
194194
const newChallenge = {
195195
name: challengeTitle,
196196
projectId: project.tcDirectId,
197+
tags: project.tags,
197198
detailedRequirements: challengeRequirements,
198199
prizes: [payment.amount],
199200
reviewType: 'INTERNAL'

services/IssueService.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,7 @@ async function handleIssueCreate(event, issue, forceAssign = false) {
636636
issue.challengeUUID = await topcoderApiHelper.createChallenge({
637637
name: issue.title,
638638
projectId,
639+
tags: project.tags,
639640
detailedRequirements: issue.body,
640641
prizes: issue.prizes
641642
});

utils/db-helper.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,24 @@ async function queryOneActiveRepository(model, url) {
342342
});
343343
}
344344

345+
/**
346+
* Get Issue's challengeUUID by repoUrl
347+
* @param {String} repoUrl The repo url
348+
* @returns {Promise<Object>}
349+
*/
350+
async function queryChallengeUUIDsByRepoUrl(repoUrl) {
351+
return await new Promise((resolve, reject) => {
352+
models.Issue.scan('repoUrl').eq(repoUrl)
353+
.attributes(['challengeUUID'])
354+
.exec((err, results) => {
355+
if (err) {
356+
return reject(err);
357+
}
358+
return resolve(results.map({challengeUUID} => challengeUUID));
359+
});
360+
});
361+
}
362+
345363
module.exports = {
346364
getById,
347365
scan,
@@ -357,6 +375,7 @@ module.exports = {
357375
queryOneUserMappingByGithubUsername,
358376
queryOneUserMappingByGitlabUsername,
359377
queryOneUserMappingByTCUsername,
378+
queryChallengeUUIDsByRepoUrl,
360379
removeCopilotPayment,
361380
removeIssue
362381
};

utils/kafka-consumer.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const _ = require('lodash');
1212
const healthcheck = require('topcoder-healthcheck-dropin');
1313
const IssueService = require('../services/IssueService');
1414
const CopilotPaymentService = require('../services/CopilotPaymentService');
15+
const ChallengeService = require('../services/ChallengeService');
1516
const logger = require('./logger');
1617
const kafka = require('./kafka');
1718

@@ -47,6 +48,12 @@ function messageHandler(messageSet) {
4748
.process(event)
4849
.catch(logger.error);
4950
}
51+
if (event && _.includes(['challengeUUIDTags.update']
52+
, event.event)) {
53+
ChallengeService
54+
.process(event)
55+
.catch(logger.error);
56+
}
5057
});
5158
}
5259

0 commit comments

Comments
 (0)