@@ -85,7 +85,7 @@ async function ensureChallengeExists(event, issue, create = true) {
85
85
if ( ! dbIssue && create ) {
86
86
logger . debug ( 'dbIssue is NULL, process to create new record and challenge' ) ;
87
87
88
- await handleIssueCreate ( event , issue ) ;
88
+ await handleIssueCreate ( event , issue , true ) ;
89
89
dbIssue = await dbHelper . queryOneIssue ( models . Issue , issue . repositoryId , issue . number , issue . provider ) ;
90
90
logger . debug ( `dbIssue is CREATED ${ dbIssue ? 'Succesfully' : 'Failed' } ` ) ;
91
91
}
@@ -188,7 +188,9 @@ async function handleIssueAssignment(event, issue, force = false) {
188
188
const err = errors . internalDependencyError ( 'Can\'t find the issue in DB. It\'s not found or not accessible' ) ;
189
189
// The dbissue is not found, the db is not accessible, or the issue is still in creation process.
190
190
// Handle it for rescheduling.
191
- await eventService . handleEventGracefully ( event , issue , err ) ;
191
+ if ( issue . tcxReady ) {
192
+ await eventService . handleEventGracefully ( event , issue , err ) ;
193
+ }
192
194
return ;
193
195
}
194
196
@@ -304,7 +306,9 @@ async function handleIssueUpdate(event, issue) {
304
306
const err = errors . internalDependencyError ( 'Can\'t find the issue in DB. It\'s not found or not accessible' ) ;
305
307
// The dbissue is not found, the db is not accessible, or the issue is still in creation process.
306
308
// Handle it for rescheduling.
307
- await eventService . handleEventGracefully ( event , issue , err ) ;
309
+ if ( issue . tcxReady ) {
310
+ await eventService . handleEventGracefully ( event , issue , err ) ;
311
+ }
308
312
return ;
309
313
}
310
314
@@ -347,7 +351,7 @@ async function handleIssueUpdate(event, issue) {
347
351
* @param {Object } issue the issue
348
352
* @private
349
353
*/
350
- async function handleIssueClose ( event , issue ) {
354
+ async function handleIssueClose ( event , issue ) { // eslint-disable-line
351
355
let dbIssue ;
352
356
try {
353
357
dbIssue = await ensureChallengeExists ( event , issue ) ;
@@ -356,7 +360,9 @@ async function handleIssueClose(event, issue) {
356
360
const err = errors . internalDependencyError ( 'Can\'t find the issue in DB. It\'s not found or not accessible' ) ;
357
361
// The dbissue is not found, the db is not accessible, or the issue is still in creation process.
358
362
// Handle it for rescheduling.
359
- await eventService . handleEventGracefully ( event , issue , err ) ;
363
+ if ( issue . tcxReady ) {
364
+ await eventService . handleEventGracefully ( event , issue , err ) ;
365
+ }
360
366
return ;
361
367
}
362
368
@@ -389,10 +395,8 @@ async function handleIssueClose(event, issue) {
389
395
390
396
if ( closeChallenge ) {
391
397
logger . debug ( `The associated challenge ${ dbIssue . challengeId } is being scheduled for cancellation since no payment will be given` ) ;
392
- setTimeout ( async ( ) => {
393
- await topcoderApiHelper . cancelPrivateContent ( dbIssue . challengeId ) ;
394
- logger . debug ( `The challenge ${ dbIssue . challengeId } is deleted` ) ;
395
- } , config . CANCEL_CHALLENGE_INTERVAL ) ; //eslint-disable-line
398
+ // Currently, there is no working API for closing challenge.
399
+ // The process is just ignored.
396
400
return ;
397
401
}
398
402
@@ -526,10 +530,10 @@ async function handleIssueClose(event, issue) {
526
530
* handles the issue create event
527
531
* @param {Object } event the event
528
532
* @param {Object } issue the issue
529
- * @param {Boolean } recreate indicate that the process is to recreate an issue
533
+ * @param {Boolean } forceAssign force the creation process to assign user
530
534
* @private
531
535
*/
532
- async function handleIssueCreate ( event , issue , recreate = false ) {
536
+ async function handleIssueCreate ( event , issue , forceAssign = false ) {
533
537
// check if project for such repository is already created
534
538
const project = await getProjectDetail ( event ) ;
535
539
@@ -546,6 +550,11 @@ async function handleIssueCreate(event, issue, recreate = false) {
546
550
`Issue ${ issue . number } is already in ${ dbIssue . status } ` ) ;
547
551
}
548
552
553
+ if ( ! issue . tcxReady ) {
554
+ logger . debug ( 'The issue doesn\'t have tcx_ labels. Creation ignored.' ) ;
555
+ return ;
556
+ }
557
+
549
558
// create issue with challenge creation pending
550
559
const issueObject = _ . assign ( { } , _ . omit ( issue , 'assignee' ) , {
551
560
id : helper . generateIdentifier ( ) ,
@@ -592,7 +601,7 @@ async function handleIssueCreate(event, issue, recreate = false) {
592
601
const comment = `Contest ${ contestUrl } has been created for this ticket.` ;
593
602
await gitHelper . createComment ( event , issue . number , comment ) ;
594
603
595
- if ( event . provider === 'gitlab' || recreate ) {
604
+ if ( event . provider === 'gitlab' || forceAssign ) {
596
605
// if assignee is added during issue create then assign as well
597
606
if ( event . data . issue . assignees && event . data . issue . assignees . length > 0 && event . data . issue . assignees [ 0 ] . id ) {
598
607
event . data . assignee = {
@@ -613,7 +622,7 @@ async function handleIssueCreate(event, issue, recreate = false) {
613
622
async function handleIssueLabelUpdated ( event , issue ) {
614
623
let dbIssue ;
615
624
try {
616
- dbIssue = await ensureChallengeExists ( event , issue , false ) ;
625
+ dbIssue = await ensureChallengeExists ( event , issue , true ) ;
617
626
} catch ( e ) {
618
627
await eventService . handleEventGracefully ( event , issue , e ) ;
619
628
return ;
@@ -639,13 +648,11 @@ async function handleIssueLabelUpdated(event, issue) {
639
648
async function handleIssueUnAssignment ( event , issue ) {
640
649
let dbIssue ;
641
650
try {
642
- dbIssue = await ensureChallengeExists ( event , issue ) ;
651
+ dbIssue = await ensureChallengeExists ( event , issue , false ) ;
643
652
644
653
if ( ! dbIssue ) {
645
- const err = errors . internalDependencyError ( 'Can\'t find the issue in DB. It\'s not found or not accessible' ) ;
646
654
// The dbissue is not found, the db is not accessible, or the issue is still in creation process.
647
- // Handle it for rescheduling.
648
- await eventService . handleEventGracefully ( event , issue , err ) ;
655
+ // Ignore it.
649
656
return ;
650
657
}
651
658
@@ -727,15 +734,44 @@ async function handleIssueUnAssignment(event, issue) {
727
734
async function handleIssueRecreate ( event , issue ) {
728
735
const dbIssue = await dbHelper . queryOneIssue ( models . Issue , issue . repositoryId , issue . number , issue . provider ) ;
729
736
737
+ // remove open for pickup and add assigned
738
+ const updateLabels = _ ( issue . labels ) // eslint-disable-line lodash/chaining
739
+ . filter ( ( i ) => ! i . startsWith ( config . ISSUE_LABEL_PREFIX ) )
740
+ . value ( ) ;
741
+
742
+ await gitHelper . addLabels ( event , issue . number , updateLabels ) ;
743
+
744
+ // Unassign the user.
745
+ if ( event . data . issue . assignees && event . data . issue . assignees . length > 0 && event . data . issue . assignees [ 0 ] . id ) {
746
+ event . data . assignee = {
747
+ id : event . data . issue . assignees [ 0 ] . id
748
+ } ;
749
+ const assigneeUserId = event . data . assignee . id ;
750
+ const assigneeUsername = await gitHelper . getUsernameById ( event , assigneeUserId ) ;
751
+ await gitHelper . removeAssign ( event , issue . number , assigneeUserId , assigneeUsername ) ;
752
+ }
753
+
730
754
try {
731
755
await dbIssue . delete ( ) ;
732
756
} catch ( err ) {
733
757
// Just log the error, keep the process go on.
734
758
logger . error ( `Error cleaning the old DB and its challenge.\n ${ err } ` ) ;
735
759
}
736
760
737
- await handleIssueCreate ( event , issue , true ) ;
738
- // handleIssueLabelUpdated(event, issue);
761
+ const issueLabels = _ ( updateLabels ) . push ( config . OPEN_FOR_PICKUP_ISSUE_LABEL ) . value ( ) ; // eslint-disable-line lodash/chaining
762
+ logger . debug ( `Adding label ${ config . OPEN_FOR_PICKUP_ISSUE_LABEL } ` ) ;
763
+ await gitHelper . addLabels ( event , issue . number , issueLabels ) ;
764
+
765
+ await handleIssueCreate ( event , issue , false ) ;
766
+
767
+ if ( event . data . issue . assignees && event . data . issue . assignees . length > 0 && event . data . issue . assignees [ 0 ] . id ) {
768
+ event . data . assignee = {
769
+ id : event . data . issue . assignees [ 0 ] . id
770
+ } ;
771
+ const assigneeUserId = event . data . assignee . id ;
772
+ const assigneeUsername = await gitHelper . getUsernameById ( event , assigneeUserId ) ;
773
+ await gitHelper . assignUser ( event , issue . number , assigneeUsername ) ;
774
+ }
739
775
}
740
776
741
777
/**
@@ -751,7 +787,8 @@ async function process(event) {
751
787
body : event . data . issue . body ,
752
788
provider : event . provider ,
753
789
repositoryId : event . data . repository . id ,
754
- labels : event . data . issue . labels
790
+ labels : event . data . issue . labels ,
791
+ tcxReady : true
755
792
} ;
756
793
const fullRepoUrl = gitHelper . getFullRepoUrl ( event ) ;
757
794
const project = await dbHelper . scanOne ( models . Project , {
@@ -766,6 +803,15 @@ async function process(event) {
766
803
if ( ! hasPrizes ) {
767
804
return ;
768
805
}
806
+
807
+ const tcxLabels = _ ( issue . labels ) // eslint-disable-line lodash/chaining
808
+ . filter ( ( i ) => i . startsWith ( config . ISSUE_LABEL_PREFIX ) )
809
+ . value ( ) ;
810
+
811
+ if ( ! tcxLabels || tcxLabels . length === 0 ) {
812
+ issue . tcxReady = false ;
813
+ }
814
+
769
815
const copilot = await userService . getRepositoryCopilotOrOwner ( event . provider , event . data . repository . full_name ) ;
770
816
event . copilot = copilot ;
771
817
0 commit comments