@@ -50,7 +50,7 @@ function parsePrizes(issue) {
50
50
}
51
51
52
52
issue . prizes = _ . map ( matches , ( match ) => parseInt ( match . replace ( '$' , '' ) , 10 ) ) ;
53
- issue . title = issue . title . replace ( / ^ ( \[ .* \] ) / , '' ) ;
53
+ issue . title = issue . title . replace ( / ^ ( \[ .* \] ) / , '' ) . trim ( ) ;
54
54
}
55
55
56
56
/**
@@ -107,15 +107,25 @@ async function handleEventGracefully(event, issue, err) {
107
107
* @returns {Object } the found db issue if exists
108
108
* @private
109
109
*/
110
- async function ensureChallengeExists ( issue ) {
111
- const dbIssue = await Issue . findOne ( {
110
+ async function ensureChallengeExists ( event , issue ) {
111
+ let dbIssue = await Issue . findOne ( {
112
112
number : issue . number ,
113
113
provider : issue . provider ,
114
114
repositoryId : issue . repositoryId
115
115
} ) ;
116
-
117
116
if ( ! dbIssue ) {
118
- throw errors . internalDependencyError ( `there is no challenge for the updated issue ${ issue . number } ` ) ;
117
+ // create if only in next retry of event
118
+ // else there can be conflict when issue being created
119
+ if ( event . retryCount && _ . toInteger ( event . retryCount ) > 1 ) {
120
+ await handleIssueCreate ( event , issue ) ;
121
+ dbIssue = await Issue . findOne ( {
122
+ number : issue . number ,
123
+ provider : issue . provider ,
124
+ repositoryId : issue . repositoryId
125
+ } ) ;
126
+ } else {
127
+ throw errors . internalDependencyError ( `there is no challenge for the updated issue ${ issue . number } ` ) ;
128
+ }
119
129
}
120
130
return dbIssue ;
121
131
}
@@ -255,13 +265,17 @@ async function handleIssueAssignment(event, issue) {
255
265
if ( userMapping && userMapping . topcoderUsername ) {
256
266
let dbIssue ;
257
267
try {
258
- dbIssue = await ensureChallengeExists ( issue ) ;
268
+ dbIssue = await ensureChallengeExists ( event , issue ) ;
259
269
260
270
logger . debug ( `Getting the topcoder member ID for member name: ${ userMapping . topcoderUsername } ` ) ;
261
271
const topcoderUserId = await topcoderApiHelper . getTopcoderMemberId ( userMapping . topcoderUsername ) ;
262
272
// Update the challenge
263
273
logger . debug ( `Assigning user to challenge: ${ userMapping . topcoderUsername } ` ) ;
264
274
assignUserAsRegistrant ( topcoderUserId , dbIssue . challengeId ) ;
275
+ dbIssue . set ( {
276
+ assignee : issue . assignee
277
+ } ) ;
278
+ await dbIssue . save ( ) ;
265
279
} catch ( err ) {
266
280
handleEventGracefully ( event , issue , err ) ;
267
281
return ;
@@ -323,7 +337,7 @@ async function handleIssueComment(event, issue) {
323
337
async function handleIssueUpdate ( event , issue ) {
324
338
let dbIssue ;
325
339
try {
326
- dbIssue = await ensureChallengeExists ( issue ) ;
340
+ dbIssue = await ensureChallengeExists ( event , issue ) ;
327
341
328
342
if ( _ . isMatch ( dbIssue , issue ) ) {
329
343
// Title, body, prizes doesn't change, just ignore
@@ -337,17 +351,19 @@ async function handleIssueUpdate(event, issue) {
337
351
detailedRequirements : issue . body ,
338
352
prizes : issue . prizes
339
353
} ) ;
354
+ // Save
355
+ dbIssue . set ( {
356
+ title : issue . title ,
357
+ body : issue . body ,
358
+ prizes : issue . prizes ,
359
+ labels : issue . labels ,
360
+ assignee : issue . assignee
361
+ } ) ;
362
+ await dbIssue . save ( ) ;
340
363
} catch ( e ) {
341
364
await handleEventGracefully ( event , issue , e ) ;
342
365
return ;
343
366
}
344
- // Save
345
- dbIssue . set ( {
346
- title : issue . title ,
347
- body : issue . body ,
348
- prizes : issue . prizes
349
- } ) ;
350
- await dbIssue . save ( ) ;
351
367
// comment on the git ticket for the user to self-sign up with the Topcoder x Self-Service tool
352
368
const contestUrl = getUrlForChallengeId ( dbIssue . challengeId ) ;
353
369
const comment = `Contest ${ contestUrl } has been updated - the new changes has been updated for this ticket.` ;
@@ -370,7 +386,7 @@ async function handleIssueUpdate(event, issue) {
370
386
async function handleIssueClose ( event , issue ) {
371
387
let dbIssue ;
372
388
try {
373
- dbIssue = await ensureChallengeExists ( issue ) ;
389
+ dbIssue = await ensureChallengeExists ( event , issue ) ;
374
390
if ( ! event . paymentSuccessful ) {
375
391
// if issue is closed without assignee then do nothing
376
392
if ( ! event . data . assignee . id ) {
@@ -519,6 +535,45 @@ async function handleIssueCreate(event, issue) {
519
535
logger . debug ( `new challenge created with id ${ issue . challengeId } for issue ${ issue . number } ` ) ;
520
536
}
521
537
538
+ /**
539
+ * handles the issue label updated event
540
+ * @param {Object } event the event
541
+ * @param {Object } issue the issue
542
+ * @private
543
+ */
544
+ async function handleIssueLabelUpdated ( event , issue ) {
545
+ let dbIssue ;
546
+ try {
547
+ dbIssue = await ensureChallengeExists ( event , issue ) ;
548
+ } catch ( e ) {
549
+ await handleEventGracefully ( event , issue , e ) ;
550
+ return ;
551
+ }
552
+ dbIssue . set ( {
553
+ labels : issue . labels
554
+ } ) ;
555
+ await dbIssue . save ( ) ;
556
+ }
557
+
558
+ /**
559
+ * handles the issue un assignment event
560
+ * @param {Object } event the event
561
+ * @param {Object } issue the issue
562
+ * @private
563
+ */
564
+ async function handleIssueUnAssignment ( event , issue ) {
565
+ let dbIssue ;
566
+ try {
567
+ dbIssue = await ensureChallengeExists ( event , issue ) ;
568
+ } catch ( e ) {
569
+ await handleEventGracefully ( event , issue , e ) ;
570
+ return ;
571
+ }
572
+ dbIssue . set ( {
573
+ assignee : null
574
+ } ) ;
575
+ await dbIssue . save ( ) ;
576
+ }
522
577
523
578
/**
524
579
* Process issue event.
@@ -532,8 +587,21 @@ async function process(event) {
532
587
title : event . data . issue . title ,
533
588
body : event . data . issue . body ,
534
589
provider : event . provider ,
535
- repositoryId : event . data . repository . id
590
+ repositoryId : event . data . repository . id ,
591
+ labels : event . data . issue . labels
536
592
} ;
593
+ let fullRepoUrl ;
594
+ if ( event . provider === 'github' ) {
595
+ fullRepoUrl = `https://github.com/${ event . data . repository . full_name } ` ;
596
+ } else if ( event . provider === 'gitlab' ) {
597
+ fullRepoUrl = `${ config . GITLAB_API_BASE_URL } /${ event . data . repository . full_name } ` ;
598
+ }
599
+
600
+ const project = await models . Project . findOne ( {
601
+ repoUrl : fullRepoUrl
602
+ } ) ;
603
+
604
+ issue . projectId = project . id ;
537
605
538
606
// Parse prize from title
539
607
parsePrizes ( issue ) ;
@@ -543,6 +611,14 @@ async function process(event) {
543
611
// Markdown the body
544
612
issue . body = md . render ( _ . get ( issue , 'body' , '' ) ) ;
545
613
614
+ if ( event . data . issue . assignees && event . data . issue . assignees . length > 0 && event . data . issue . assignees [ 0 ] . id ) {
615
+ if ( event . provider === 'github' ) {
616
+ issue . assignee = await gitHubService . getUsernameById ( copilot , event . data . issue . assignees [ 0 ] . id ) ;
617
+ } else if ( event . provider === 'gitlab' ) {
618
+ issue . assignee = await gitlabService . getUsernameById ( copilot , event . data . issue . assignees [ 0 ] . id ) ;
619
+ }
620
+ }
621
+ console . warn ( JSON . stringify ( issue ) ) ;
546
622
if ( event . event === 'issue.created' ) {
547
623
await handleIssueCreate ( event , issue ) ;
548
624
} else if ( event . event === 'issue.updated' ) {
@@ -553,11 +629,16 @@ async function process(event) {
553
629
await handleIssueComment ( event , issue ) ;
554
630
} else if ( event . event === 'issue.assigned' ) {
555
631
await handleIssueAssignment ( event , issue ) ;
632
+ } else if ( event . event === 'issue.labelUpdated' ) {
633
+ await handleIssueLabelUpdated ( event , issue ) ;
634
+ } else if ( event . event === 'issue.unassigned' ) {
635
+ await handleIssueUnAssignment ( event , issue ) ;
556
636
}
557
637
}
558
638
559
639
process . schema = Joi . object ( ) . keys ( {
560
- event : Joi . string ( ) . valid ( 'issue.created' , 'issue.updated' , 'issue.closed' , 'comment.created' , 'comment.updated' , 'issue.assigned' ) . required ( ) ,
640
+ event : Joi . string ( ) . valid ( 'issue.created' , 'issue.updated' , 'issue.closed' , 'comment.created' , 'comment.updated' , 'issue.assigned' ,
641
+ 'issue.labelUpdated' , 'issue.unassigned' ) . required ( ) ,
561
642
provider : Joi . string ( ) . valid ( 'github' , 'gitlab' ) . required ( ) ,
562
643
data : Joi . object ( ) . keys ( {
563
644
issue : Joi . object ( ) . keys ( {
@@ -586,7 +667,8 @@ process.schema = Joi.object().keys({
586
667
} ) ,
587
668
assignee : Joi . object ( ) . keys ( {
588
669
id : Joi . number ( ) . required ( ) . allow ( null )
589
- } )
670
+ } ) ,
671
+ labels : Joi . array ( ) . items ( Joi . string ( ) )
590
672
} ) . required ( ) ,
591
673
retryCount : Joi . number ( ) . integer ( ) . default ( 0 ) . optional ( ) ,
592
674
paymentSuccessful : Joi . boolean ( ) . default ( false ) . optional ( )
0 commit comments