Skip to content

Commit 6be90cf

Browse files
committed
feat: introduce point reward type
Signed-off-by: Rakib Ansary <[email protected]>
1 parent fe9ed92 commit 6be90cf

File tree

5 files changed

+179
-132
lines changed

5 files changed

+179
-132
lines changed

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ workflows:
9090
branches:
9191
only:
9292
- dev
93-
- PLAT-3491
93+
- CORE-40
9494

9595
- "build-qa":
9696
context: org-global

app-constants.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ const prizeSetTypes = {
1818
CheckpointPrizes: "checkpoint",
1919
};
2020

21+
const prizeTypes = {
22+
USD: "USD",
23+
POINT: "POINT",
24+
};
25+
2126
const challengeStatuses = {
2227
New: "New",
2328
Draft: "Draft",
@@ -137,6 +142,7 @@ const SelfServiceNotificationSettings = {
137142
module.exports = {
138143
UserRoles,
139144
prizeSetTypes,
145+
prizeTypes,
140146
challengeStatuses,
141147
validChallengeParams,
142148
EVENT_ORIGINATOR,

src/common/challenge-helper.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,23 @@ class ChallengeHelper {
9999
await Promise.all(promises);
100100
}
101101

102+
validatePrizeSetsAndGetPrizeType(prizeSets) {
103+
if (_.isEmpty(prizeSets)) return null;
104+
105+
const firstType = _.get(prizeSets, "[0].prizes[0].type", null);
106+
if (!firstType) return null;
107+
108+
const isConsistent = _.every(prizeSets, (prizeSet) =>
109+
_.every(prizeSet.prizes, (prize) => prize.type === firstType)
110+
);
111+
112+
if (!isConsistent) {
113+
throw new errors.BadRequestError("All prizes must be of the same type");
114+
}
115+
116+
return firstType;
117+
}
118+
102119
/**
103120
* Validate Challenge skills.
104121
* @param {Object} challenge the challenge
@@ -114,7 +131,9 @@ class ChallengeHelper {
114131
if (oldChallenge && oldChallenge.status === constants.challengeStatuses.Completed) {
115132
// Don't allow edit skills for Completed challenges
116133
if (!_.isEqual(ids, _.uniq(_.map(oldChallenge.skills, "id")))) {
117-
throw new errors.BadRequestError("Cannot update skills for challenges with Completed status");
134+
throw new errors.BadRequestError(
135+
"Cannot update skills for challenges with Completed status"
136+
);
118137
}
119138
}
120139

@@ -469,6 +488,7 @@ class ChallengeHelper {
469488
return ChallengeHelper.convertDateToISOString(startDate);
470489
}
471490

491+
// TODO: Deprecate this method
472492
convertPrizeSetValuesToCents(prizeSets) {
473493
prizeSets.forEach((prizeSet) => {
474494
prizeSet.prizes.forEach((prize) => {
@@ -478,6 +498,7 @@ class ChallengeHelper {
478498
});
479499
}
480500

501+
// TODO: Deprecate this method
481502
convertPrizeSetValuesToDollars(prizeSets, overview) {
482503
prizeSets.forEach((prizeSet) => {
483504
prizeSet.prizes.forEach((prize) => {

src/services/ChallengeService.js

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -920,7 +920,9 @@ searchChallenges.schema = {
920920
*/
921921
async function createChallenge(currentUser, challenge, userToken) {
922922
await challengeHelper.validateCreateChallengeRequest(currentUser, challenge);
923+
let prizeTypeTmp = challengeHelper.validatePrizeSetsAndGetPrizeType(challenge.prizeSets);
923924

925+
console.log("TYPE", prizeTypeTmp);
924926
if (challenge.legacy.selfService) {
925927
// if self-service, create a new project (what about if projectId is provided in the payload? confirm with business!)
926928
if (!challenge.projectId) {
@@ -1055,9 +1057,17 @@ async function createChallenge(currentUser, challenge, userToken) {
10551057
grpcMetadata.set("userId", currentUser.userId);
10561058
grpcMetadata.set("token", await getM2MToken());
10571059

1058-
convertPrizeSetValuesToCents(challenge.prizeSets);
1060+
const prizeType = challengeHelper.validatePrizeSetsAndGetPrizeType(challenge.prizeSets);
1061+
1062+
if (prizeType === constants.prizeTypes.USD) {
1063+
convertPrizeSetValuesToCents(challenge.prizeSets);
1064+
}
1065+
10591066
const ret = await challengeDomain.create(challenge, grpcMetadata);
1060-
convertPrizeSetValuesToDollars(ret.prizeSets, ret.overview);
1067+
1068+
if (prizeType === constants.prizeTypes.USD) {
1069+
convertPrizeSetValuesToDollars(ret.prizeSets, ret.overview);
1070+
}
10611071

10621072
ret.numOfSubmissions = 0;
10631073
ret.numOfRegistrants = 0;
@@ -1484,7 +1494,11 @@ function validateTask(currentUser, challenge, data, challengeResources) {
14841494
*/
14851495
async function updateChallenge(currentUser, challengeId, data) {
14861496
const challenge = await challengeDomain.lookup(getLookupCriteria("id", challengeId));
1487-
convertPrizeSetValuesToDollars(challenge.prizeSets, challenge.overview);
1497+
const existingPrizeType = challengeHelper.validatePrizeSetsAndGetPrizeType(challenge.prizeSets);
1498+
1499+
if (existingPrizeType === constants.prizeTypes.USD) {
1500+
convertPrizeSetValuesToDollars(challenge.prizeSets, challenge.overview);
1501+
}
14881502

14891503
const projectId = _.get(challenge, "projectId");
14901504

@@ -1881,28 +1895,30 @@ async function updateChallenge(currentUser, challengeId, data) {
18811895
}
18821896
}
18831897

1884-
try {
1885-
const updateInput = sanitizeRepeatedFieldsInUpdateRequest(_.omit(data, ["cancelReason"]));
1886-
if (!_.isEmpty(updateInput)) {
1887-
const grpcMetadata = new GrpcMetadata();
1898+
const updateInput = sanitizeRepeatedFieldsInUpdateRequest(_.omit(data, ["cancelReason"]));
1899+
if (!_.isEmpty(updateInput)) {
1900+
const grpcMetadata = new GrpcMetadata();
18881901

1889-
grpcMetadata.set("handle", currentUser.handle);
1890-
grpcMetadata.set("userId", currentUser.userId);
1891-
grpcMetadata.set("token", await getM2MToken());
1902+
grpcMetadata.set("handle", currentUser.handle);
1903+
grpcMetadata.set("userId", currentUser.userId);
1904+
grpcMetadata.set("token", await getM2MToken());
18921905

1893-
if (updateInput.prizeSetUpdate != null) {
1894-
convertPrizeSetValuesToCents(updateInput.prizeSetUpdate.prizeSets);
1895-
}
1896-
await challengeDomain.update(
1897-
{
1898-
filterCriteria: getScanCriteria({ id: challengeId }),
1899-
updateInput,
1900-
},
1901-
grpcMetadata
1906+
const newPrizeType = challengeHelper.validatePrizeSetsAndGetPrizeType(updateInput.prizeSets);
1907+
if (newPrizeType != null && existingPrizeType != null && newPrizeType !== existingPrizeType) {
1908+
throw new errors.BadRequestError(
1909+
`Cannot change prize type from ${existingPrizeType} to ${newPrizeType}`
19021910
);
19031911
}
1904-
} catch (e) {
1905-
throw e;
1912+
if (updateInput.prizeSetUpdate != null && newPrizeType === constants.prizeTypes.USD) {
1913+
convertPrizeSetValuesToCents(updateInput.prizeSetUpdate.prizeSets);
1914+
}
1915+
await challengeDomain.update(
1916+
{
1917+
filterCriteria: getScanCriteria({ id: challengeId }),
1918+
updateInput,
1919+
},
1920+
grpcMetadata
1921+
);
19061922
}
19071923

19081924
const updatedChallenge = await challengeDomain.lookup(getLookupCriteria("id", challengeId));
@@ -2416,7 +2432,11 @@ advancePhase.schema = {
24162432
};
24172433

24182434
async function indexChallengeAndPostToKafka(updatedChallenge, track, type) {
2419-
convertPrizeSetValuesToDollars(updatedChallenge.prizeSets, updatedChallenge.overview);
2435+
const prizeType = challengeHelper.validatePrizeSetsAndGetPrizeType(updatedChallenge.prizeSets);
2436+
2437+
if (prizeType === constants.prizeTypes.USD) {
2438+
convertPrizeSetValuesToDollars(updatedChallenge.prizeSets, updatedChallenge.overview);
2439+
}
24202440

24212441
if (track == null || type == null) {
24222442
const trackAndTypeData = await challengeHelper.validateAndGetChallengeTypeAndTrack({

0 commit comments

Comments
 (0)