Skip to content

Commit b9bfb17

Browse files
authored
Merge pull request #105 from topcoder-platform/PM-1105_checkpoint-winners
PM-1105 - Checkpoint winners
2 parents 668d89f + 703b781 commit b9bfb17

File tree

2 files changed

+62
-17
lines changed

2 files changed

+62
-17
lines changed

src/api/challenges/challenges.service.ts

Lines changed: 60 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import {
1414
Challenge,
1515
ChallengeResource,
1616
ChallengeReview,
17+
Prize,
1718
ResourceRole,
19+
Winner,
1820
} from './models';
1921
import { BillingAccountsService } from 'src/shared/topcoder/billing-accounts.service';
2022
import { TopcoderM2MService } from 'src/shared/topcoder/topcoder-m2m.service';
@@ -117,9 +119,12 @@ export class ChallengesService {
117119
}
118120
}
119121

120-
generateWinnersPayments(challenge: Challenge): PaymentPayload[] {
121-
const { prizeSets, winners } = challenge;
122-
122+
generateWinnersPayments(
123+
challenge: Challenge,
124+
winners: Winner[],
125+
prizes: Prize[],
126+
type?: WinningsCategory,
127+
): PaymentPayload[] {
123128
const isCancelledFailedReview =
124129
challenge.status.toLowerCase() ===
125130
ChallengeStatuses.CancelledFailedReview.toLowerCase();
@@ -128,6 +133,53 @@ export class ChallengesService {
128133
return [];
129134
}
130135

136+
return winners.map((winner) => ({
137+
handle: winner.handle,
138+
amount: prizes[winner.placement - 1].value,
139+
userId: winner.userId.toString(),
140+
type:
141+
type ??
142+
(challenge.task.isTask
143+
? WinningsCategory.TASK_PAYMENT
144+
: WinningsCategory.CONTEST_PAYMENT),
145+
description:
146+
challenge.type === 'Task'
147+
? challenge.name
148+
: `${challenge.name} - ${placeToOrdinal(winner.placement)} Place`,
149+
}));
150+
}
151+
152+
generateCheckpointWinnersPayments(challenge: Challenge): PaymentPayload[] {
153+
const { prizeSets, checkpointWinners } = challenge;
154+
155+
// generate placement payments
156+
const checkpointPrizes = orderBy(
157+
find(prizeSets, { type: 'CHECKPOINT' })?.prizes,
158+
'value',
159+
'desc',
160+
);
161+
162+
if ((checkpointPrizes?.length ?? 0) < (checkpointWinners?.length ?? 0)) {
163+
throw new Error(
164+
'Task has incorrect number of checkpoint prizes! There are more checkpoint winners than checkpoint prizes!',
165+
);
166+
}
167+
168+
if (!checkpointPrizes?.length) {
169+
return [];
170+
}
171+
172+
return this.generateWinnersPayments(
173+
challenge,
174+
checkpointWinners,
175+
checkpointPrizes,
176+
WinningsCategory.CONTEST_CHECKPOINT_PAYMENT,
177+
);
178+
}
179+
180+
generatePlacementWinnersPayments(challenge: Challenge): PaymentPayload[] {
181+
const { prizeSets, winners } = challenge;
182+
131183
// generate placement payments
132184
const placementPrizes = orderBy(
133185
find(prizeSets, { type: 'PLACEMENT' })?.prizes,
@@ -141,18 +193,7 @@ export class ChallengesService {
141193
);
142194
}
143195

144-
return winners.map((winner) => ({
145-
handle: winner.handle,
146-
amount: placementPrizes[winner.placement - 1].value,
147-
userId: winner.userId.toString(),
148-
type: challenge.task.isTask
149-
? WinningsCategory.TASK_PAYMENT
150-
: WinningsCategory.CONTEST_PAYMENT,
151-
description:
152-
challenge.type === 'Task'
153-
? challenge.name
154-
: `${challenge.name} - ${placeToOrdinal(winner.placement)} Place`,
155-
}));
196+
return this.generateWinnersPayments(challenge, winners, placementPrizes);
156197
}
157198

158199
generateCopilotPayment(
@@ -284,7 +325,9 @@ export class ChallengesService {
284325
throw new Error('Missing challenge resources!');
285326
}
286327

287-
const winnersPayments = this.generateWinnersPayments(challenge);
328+
const winnersPayments = this.generatePlacementWinnersPayments(challenge);
329+
const checkpointPayments =
330+
this.generateCheckpointWinnersPayments(challenge);
288331
const copilotPayments = this.generateCopilotPayment(
289332
challenge,
290333
challengeResources.copilot,
@@ -315,6 +358,7 @@ export class ChallengesService {
315358

316359
const payments: PaymentPayload[] = [
317360
...winnersPayments,
361+
...checkpointPayments,
318362
...copilotPayments,
319363
...reviewersPayments,
320364
];

src/api/challenges/models/challenge.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ export interface Challenge {
3636
created: string;
3737
updated: string;
3838
overview: PrizeOverview;
39-
winners: Winner[]; // Replace with type if needed
39+
winners: Winner[];
40+
checkpointWinners: Winner[];
4041
numOfSubmissions: number;
4142
numOfCheckpointSubmissions: number;
4243
numOfRegistrants: number;

0 commit comments

Comments
 (0)