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

Prevent double payment processing. #27

Merged
merged 1 commit into from
Nov 23, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 41 additions & 14 deletions services/IssueService.js
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,16 @@ async function handleIssueClose(event, issue) {
dbIssue = await ensureChallengeExists(event, issue);
event.dbIssue = dbIssue;

// if the issue has payment success or payment pending status, we'll ignore this process.
if (dbIssue && dbIssue.status === 'challenge_payment_successful') {
logger.debug(`Ignoring close issue processing. The issue has challenge_payment_successful.`);
return;
}
if (dbIssue && dbIssue.status === 'challenge_payment_pending') {
logger.debug(`Ignoring close issue processing. The issue has challenge_payment_pending.`);
return;
}

if (!event.paymentSuccessful) {
let closeChallenge = false;
// if issue is closed without Fix accepted label
Expand Down Expand Up @@ -390,6 +400,12 @@ async function handleIssueClose(event, issue) {
return;
}

// update the issue status to payment pending to prevent double processing.
await dbHelper.update(models.Issue, dbIssue.id, {
status: 'challenge_payment_pending',
updatedAt: new Date()
});

logger.debug(`Looking up TC handle of git user: ${event.data.assignee.id}`);
const assigneeMember = await userService.getTCUserName(event.provider, event.data.assignee.id);
event.assigneeMember = assigneeMember;
Expand Down Expand Up @@ -459,23 +475,34 @@ async function handleIssueClose(event, issue) {
}
} catch (e) {
event.paymentSuccessful = event.paymentSuccessful === true; // if once paid shouldn't be false
// update the issue status to payment failed
if (!event.paymentSuccessful) {
await dbHelper.update(models.Issue, dbIssue.id, {
status: 'challenge_payment_failed',
updatedAt: new Date()
});
}
await eventService.handleEventGracefully(event, issue, e);
return;
}
try {
logger.debug('update issue as paid');
const labels = _(dbIssue.labels)
.filter((i) => i !== config.OPEN_FOR_PICKUP_ISSUE_LABEL && i !== config.ASSIGNED_ISSUE_LABEL)
.push(config.ASSIGNED_ISSUE_LABEL)
.value();
dbIssue = await dbHelper.update(models.Issue, dbIssue.id, {
labels,
updatedAt: new Date()
});
await gitHelper.markIssueAsPaid(event, issue.number, dbIssue.challengeId, labels);
} catch (e) {
await eventService.handleEventGracefully(event, issue, e);
return;
// Only update the label to paid if the payment successfully processed.
if (event.paymentSuccessful) {
try {
logger.debug('update issue as paid');
const labels = _(dbIssue.labels)
.filter((i) => i !== config.OPEN_FOR_PICKUP_ISSUE_LABEL && i !== config.ASSIGNED_ISSUE_LABEL)
.push(config.ASSIGNED_ISSUE_LABEL)
.value();
dbIssue = await dbHelper.update(models.Issue, dbIssue.id, {
labels,
status: 'challenge_payment_successful',
updatedAt: new Date()
});
await gitHelper.markIssueAsPaid(event, issue.number, dbIssue.challengeId, labels);
} catch (e) {
await eventService.handleEventGracefully(event, issue, e);
return;
}
}
}

Expand Down