@@ -31,11 +31,13 @@ const currentUserSchema = Joi.object().keys({
3131 handle : Joi . string ( ) . required ( ) ,
3232 roles : Joi . array ( ) . required ( ) ,
3333} ) ;
34- const projectSchema = {
34+ const updateProjectSchema = {
3535 project : {
3636 id : Joi . string ( ) . required ( ) ,
3737 title : Joi . string ( ) . required ( ) ,
3838 tcDirectId : Joi . number ( ) . required ( ) ,
39+ //NOTE: `PATCH /challenges/:challengeId` requires the tags not empty
40+ tags : Joi . array ( ) . items ( Joi . string ( ) . required ( ) ) . min ( 1 ) . required ( ) ,
3941 repoUrl : Joi . string ( ) . required ( ) ,
4042 repoUrls : Joi . array ( ) . required ( ) ,
4143 rocketChatWebhook : Joi . string ( ) . allow ( null ) ,
@@ -57,6 +59,8 @@ const createProjectSchema = {
5759 project : {
5860 title : Joi . string ( ) . required ( ) ,
5961 tcDirectId : Joi . number ( ) . required ( ) ,
62+ //NOTE: `PATCH /challenges/:challengeId` requires the tags not empty
63+ tags : Joi . array ( ) . items ( Joi . string ( ) . required ( ) ) . min ( 1 ) . required ( ) ,
6064 repoUrl : Joi . string ( ) . required ( ) ,
6165 copilot : Joi . string ( ) . allow ( null ) ,
6266 rocketChatWebhook : Joi . string ( ) . allow ( null ) ,
@@ -125,7 +129,7 @@ async function _ensureEditPermissionAndGetInfo(projectId, currentUser) {
125129 * @param {String } repoUrl the repository url
126130 * @param {Object } project the new project
127131 * @param {String } currentUser the topcoder current user
128- * @returns {void }
132+ * @returns {Array } challengeUUIDs
129133 * @private
130134 */
131135async function _createOrMigrateRepository ( repoUrl , project , currentUser ) {
@@ -159,6 +163,9 @@ async function _createOrMigrateRepository(repoUrl, project, currentUser) {
159163 catch ( err ) {
160164 throw new Error ( `Update ProjectId for Repository, Issue, CopilotPayment failed. Repo ${ repoUrl } . Internal Error: ${ err } ` ) ;
161165 }
166+
167+ const oldProject = await dbHelper . getById ( models . Project , oldRepo . projectId ) ;
168+ return _ . isEqual ( oldProject . tags , project . tags ) ? [ ] : challengeUUIDs ;
162169 } else {
163170 try {
164171 await dbHelper . create ( models . Repository , {
@@ -175,6 +182,8 @@ async function _createOrMigrateRepository(repoUrl, project, currentUser) {
175182 throw new Error ( `Project created. Adding the webhook, issue labels, and wiki rules failed. Repo ${ repoUrl } . Internal Error: ${ err } ` ) ;
176183 }
177184 }
185+
186+ return [ ] ;
178187}
179188
180189/**
@@ -206,16 +215,32 @@ async function create(project, currentUser) {
206215
207216 const createdProject = await dbHelper . create ( models . Project , project ) ;
208217
218+ let challengeUUIDsList = [ ] ;
209219 // TODO: The following db operation should/could be moved into one transaction
210220 for ( const repoUrl of repoUrls ) { // eslint-disable-line no-restricted-syntax
211221 try {
212- await _createOrMigrateRepository ( repoUrl , project , currentUser ) ;
222+ const challengeUUIDs = await _createOrMigrateRepository ( repoUrl , project , currentUser ) ;
223+ if ( ! _ . isEmpty ( challengeUUIDs ) ) {
224+ challengeUUIDsList . append ( challengeUUIDs ) ;
225+ }
213226 }
214227 catch ( err ) {
215228 throw new Error ( `Create or migrate repository failed. Repo ${ repoUrl } . Internal Error: ${ err . message } ` ) ;
216229 }
217230 }
218231
232+ // NOTE: Will update challenge tags even if the project is created with archived at this step, currently.
233+ if ( ! _ . isEmpty ( challengeUUIDsList ) ) {
234+ const projectTagsUpdatedEvent = {
235+ event : 'challengeTags.update' ,
236+ data : {
237+ challengeUUIDsList,
238+ tags : project . tags ,
239+ } ,
240+ } ;
241+ await kafka . send ( JSON . stringify ( projectTagsUpdatedEvent ) ) ;
242+ }
243+
219244 return createdProject ;
220245}
221246
@@ -253,32 +278,50 @@ async function update(project, currentUser) {
253278 */
254279 project . owner = dbProject . owner ;
255280 project . copilot = project . copilot !== undefined ? project . copilot . toLowerCase ( ) : null ;
256- Object . entries ( project ) . map ( ( item ) => {
257- dbProject [ item [ 0 ] ] = item [ 1 ] ;
258- return item ;
259- } ) ;
260281
261282 // TODO: move the following logic into one dynamoose transaction
262- const repos = await dbHelper . queryRepositoriesByProjectId ( dbProject . id ) ;
283+ const repos = await dbHelper . queryRepositoriesByProjectId ( project . id ) ;
263284
285+ let challengeUUIDsList = [ ] ;
264286 for ( const repoUrl of repoUrls ) { // eslint-disable-line no-restricted-syntax
265287 if ( repos . find ( repo => repo . url === repoUrl ) ) {
266288 const repoId = repos . find ( repo => repo . url === repoUrl ) . id
267289 await dbHelper . update ( models . Repository , repoId , { archived : project . archived } ) ;
290+ if ( ! _ . isEqual ( dbProject . tags , project . tags ) ) {
291+ // NOTE: delay query of challengeUUIDs into topcoder-x-processor
292+ challengeUUIDsList . append ( repoUrl ) ;
293+ }
268294 } else {
269295 try {
270- await _createOrMigrateRepository ( repoUrl , project , currentUser ) ;
296+ const challengeUUIDs = await _createOrMigrateRepository ( repoUrl , project , currentUser ) ;
297+ if ( ! _ . isEmpty ( challengeUUIDs ) ) {
298+ challengeUUIDsList . append ( challengeUUIDs ) ;
299+ }
271300 }
272301 catch ( err ) {
273302 throw new Error ( `Create or migrate repository failed. Repo ${ repoUrl } . Internal Error: ${ err . message } ` ) ;
274303 }
275304 }
276305 }
277- dbProject . updatedAt = new Date ( ) ;
278- return await dbHelper . update ( models . Project , dbProject . id , dbProject ) ;
306+ project . updatedAt = new Date ( ) ;
307+ const updatedProject = await dbHelper . update ( models . Project , project . id , project ) ;
308+
309+ // NOTE: Will update challenge tags even if the project is changed to archived at this step, currently.
310+ if ( ! _ . isEmpty ( challengeUUIDsList ) ) {
311+ const projectTagsUpdatedEvent = {
312+ event : 'challengeTags.update' ,
313+ data : {
314+ challengeUUIDsList,
315+ tags : project . tags ,
316+ } ,
317+ } ;
318+ await kafka . send ( JSON . stringify ( projectTagsUpdatedEvent ) ) ;
319+ }
320+
321+ return updatedProject ;
279322}
280323
281- update . schema = projectSchema ;
324+ update . schema = updateProjectSchema ;
282325
283326/**
284327 * gets all projects
0 commit comments