@@ -26,6 +26,10 @@ const eventService = require('./EventService');
26
26
27
27
const md = new MarkdownIt ( ) ;
28
28
29
+ // A variable to store issue creation lock to prevent duplicate creation process.
30
+ // The key is `${provider}-${repositoryId}-${number}`. The value is True.
31
+ const issueCreationLock = { } ;
32
+
29
33
/**
30
34
* Generate the contest url, given the challenge id
31
35
* @param {String } challengeId The id of the challenge in topcoder
@@ -555,6 +559,13 @@ async function handleIssueCreate(event, issue, forceAssign = false) {
555
559
return ;
556
560
}
557
561
562
+ const creationLockKey = `${ issue . provider } -${ issue . repositoryId } -${ issue . number } ` ;
563
+ if ( issueCreationLock [ creationLockKey ] ) {
564
+ throw new Error (
565
+ `Issue ${ creationLockKey } is creating.` ) ;
566
+ }
567
+ issueCreationLock [ creationLockKey ] = true ;
568
+
558
569
// create issue with challenge creation pending
559
570
const issueObject = _ . assign ( { } , _ . omit ( issue , 'assignee' ) , {
560
571
id : helper . generateIdentifier ( ) ,
@@ -594,6 +605,7 @@ async function handleIssueCreate(event, issue, forceAssign = false) {
594
605
logger . error ( `Challenge creation failure: ${ e } ` ) ;
595
606
await dbHelper . removeIssue ( models . Issue , issue . repositoryId , issue . number , issue . provider ) ;
596
607
await eventService . handleEventGracefully ( event , issue , e ) ;
608
+ delete issueCreationLock [ creationLockKey ] ;
597
609
return ;
598
610
}
599
611
@@ -610,6 +622,7 @@ async function handleIssueCreate(event, issue, forceAssign = false) {
610
622
await handleIssueAssignment ( event , issue , true ) ;
611
623
}
612
624
}
625
+ delete issueCreationLock [ creationLockKey ] ;
613
626
logger . debug ( `new challenge created with id ${ issue . challengeId } for issue ${ issue . number } ` ) ;
614
627
}
615
628
0 commit comments