@@ -347,6 +347,16 @@ async function handleIssueClose(event, issue) {
347
347
dbIssue = await ensureChallengeExists ( event , issue ) ;
348
348
event . dbIssue = dbIssue ;
349
349
350
+ // if the issue has payment success or payment pending status, we'll ignore this process.
351
+ if ( dbIssue && dbIssue . status === 'challenge_payment_successful' ) {
352
+ logger . debug ( `Ignoring close issue processing. The issue has challenge_payment_successful.` ) ;
353
+ return ;
354
+ }
355
+ if ( dbIssue && dbIssue . status === 'challenge_payment_pending' ) {
356
+ logger . debug ( `Ignoring close issue processing. The issue has challenge_payment_pending.` ) ;
357
+ return ;
358
+ }
359
+
350
360
if ( ! event . paymentSuccessful ) {
351
361
let closeChallenge = false ;
352
362
// if issue is closed without Fix accepted label
@@ -390,6 +400,12 @@ async function handleIssueClose(event, issue) {
390
400
return ;
391
401
}
392
402
403
+ // update the issue status to payment pending to prevent double processing.
404
+ await dbHelper . update ( models . Issue , dbIssue . id , {
405
+ status : 'challenge_payment_pending' ,
406
+ updatedAt : new Date ( )
407
+ } ) ;
408
+
393
409
logger . debug ( `Looking up TC handle of git user: ${ event . data . assignee . id } ` ) ;
394
410
const assigneeMember = await userService . getTCUserName ( event . provider , event . data . assignee . id ) ;
395
411
event . assigneeMember = assigneeMember ;
@@ -459,23 +475,34 @@ async function handleIssueClose(event, issue) {
459
475
}
460
476
} catch ( e ) {
461
477
event . paymentSuccessful = event . paymentSuccessful === true ; // if once paid shouldn't be false
478
+ // update the issue status to payment failed
479
+ if ( ! event . paymentSuccessful ) {
480
+ await dbHelper . update ( models . Issue , dbIssue . id , {
481
+ status : 'challenge_payment_failed' ,
482
+ updatedAt : new Date ( )
483
+ } ) ;
484
+ }
462
485
await eventService . handleEventGracefully ( event , issue , e ) ;
463
486
return ;
464
487
}
465
- try {
466
- logger . debug ( 'update issue as paid' ) ;
467
- const labels = _ ( dbIssue . labels )
468
- . filter ( ( i ) => i !== config . OPEN_FOR_PICKUP_ISSUE_LABEL && i !== config . ASSIGNED_ISSUE_LABEL )
469
- . push ( config . ASSIGNED_ISSUE_LABEL )
470
- . value ( ) ;
471
- dbIssue = await dbHelper . update ( models . Issue , dbIssue . id , {
472
- labels,
473
- updatedAt : new Date ( )
474
- } ) ;
475
- await gitHelper . markIssueAsPaid ( event , issue . number , dbIssue . challengeId , labels ) ;
476
- } catch ( e ) {
477
- await eventService . handleEventGracefully ( event , issue , e ) ;
478
- return ;
488
+ // Only update the label to paid if the payment successfully processed.
489
+ if ( event . paymentSuccessful ) {
490
+ try {
491
+ logger . debug ( 'update issue as paid' ) ;
492
+ const labels = _ ( dbIssue . labels )
493
+ . filter ( ( i ) => i !== config . OPEN_FOR_PICKUP_ISSUE_LABEL && i !== config . ASSIGNED_ISSUE_LABEL )
494
+ . push ( config . ASSIGNED_ISSUE_LABEL )
495
+ . value ( ) ;
496
+ dbIssue = await dbHelper . update ( models . Issue , dbIssue . id , {
497
+ labels,
498
+ status : 'challenge_payment_successful' ,
499
+ updatedAt : new Date ( )
500
+ } ) ;
501
+ await gitHelper . markIssueAsPaid ( event , issue . number , dbIssue . challengeId , labels ) ;
502
+ } catch ( e ) {
503
+ await eventService . handleEventGracefully ( event , issue , e ) ;
504
+ return ;
505
+ }
479
506
}
480
507
}
481
508
0 commit comments