Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 55f4bf2

Browse files
committed
Prevent double payment processing.
1 parent 30c2569 commit 55f4bf2

File tree

1 file changed

+41
-14
lines changed

1 file changed

+41
-14
lines changed

services/IssueService.js

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,16 @@ async function handleIssueClose(event, issue) {
347347
dbIssue = await ensureChallengeExists(event, issue);
348348
event.dbIssue = dbIssue;
349349

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+
350360
if (!event.paymentSuccessful) {
351361
let closeChallenge = false;
352362
// if issue is closed without Fix accepted label
@@ -390,6 +400,12 @@ async function handleIssueClose(event, issue) {
390400
return;
391401
}
392402

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+
393409
logger.debug(`Looking up TC handle of git user: ${event.data.assignee.id}`);
394410
const assigneeMember = await userService.getTCUserName(event.provider, event.data.assignee.id);
395411
event.assigneeMember = assigneeMember;
@@ -459,23 +475,34 @@ async function handleIssueClose(event, issue) {
459475
}
460476
} catch (e) {
461477
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+
}
462485
await eventService.handleEventGracefully(event, issue, e);
463486
return;
464487
}
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+
}
479506
}
480507
}
481508

0 commit comments

Comments
 (0)