Skip to content

Commit 7251d11

Browse files
authored
Merge pull request #21 from topcoder-platform/PM-1112_rename-reviewer-payment-fields
PM-1112 - rename reviewer payment fields, use "coefficient"
2 parents efde866 + 5f46e59 commit 7251d11

File tree

4 files changed

+86
-57
lines changed

4 files changed

+86
-57
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-- AlterTable
2+
ALTER TABLE "ChallengeReviewer" ADD COLUMN "fixedAmount" DOUBLE PRECISION DEFAULT 0;
3+
ALTER TABLE "ChallengeReviewer" RENAME COLUMN "basePayment" TO "baseCoefficient";
4+
ALTER TABLE "ChallengeReviewer" RENAME COLUMN "incrementalPayment" TO "incrementalCoefficient";
5+
ALTER TABLE "DefaultChallengeReviewer" ADD COLUMN "fixedAmount" DOUBLE PRECISION DEFAULT 0;
6+
ALTER TABLE "DefaultChallengeReviewer" RENAME COLUMN "basePayment" TO "baseCoefficient";
7+
ALTER TABLE "DefaultChallengeReviewer" RENAME COLUMN "incrementalPayment" TO "incrementalCoefficient";

prisma/schema.prisma

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -588,8 +588,9 @@ model ChallengeReviewer {
588588
isMemberReview Boolean
589589
memberReviewerCount Int?
590590
phaseId String
591-
basePayment Float?
592-
incrementalPayment Float?
591+
fixedAmount Float? @default(0)
592+
baseCoefficient Float?
593+
incrementalCoefficient Float?
593594
type ReviewOpportunityTypeEnum?
594595
aiWorkflowId String? @db.VarChar(14)
595596
shouldOpenOpportunity Boolean @default(true)
@@ -625,8 +626,9 @@ model DefaultChallengeReviewer {
625626
phaseName String
626627
// Optional explicit link to Phase for better fidelity
627628
phaseId String?
628-
basePayment Float?
629-
incrementalPayment Float?
629+
fixedAmount Float? @default(0)
630+
baseCoefficient Float?
631+
incrementalCoefficient Float?
630632
opportunityType ReviewOpportunityTypeEnum?
631633
isAIReviewer Boolean
632634
shouldOpenOpportunity Boolean @default(true)

src/common/prisma-helper.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,7 @@ function convertChallengeSchemaToPrisma(currentUser, challenge) {
172172
// Database stores values in dollars directly, no amountInCents field exists
173173
prizeData.value = p.value;
174174
// calculate only placement and checkpoint prizes
175-
if (s.type === PrizeSetTypeEnum.PLACEMENT && p.type === constants.prizeTypes.USD)
176-
{
175+
if (s.type === PrizeSetTypeEnum.PLACEMENT && p.type === constants.prizeTypes.USD) {
177176
// Values are already in dollars, no conversion needed
178177
totalPrizes += p.value;
179178
}
@@ -229,8 +228,10 @@ function convertChallengeSchemaToPrisma(currentUser, challenge) {
229228
memberReviewerCount: _.isNil(r.memberReviewerCount)
230229
? null
231230
: Number(r.memberReviewerCount),
232-
basePayment: _.isNil(r.basePayment) ? null : Number(r.basePayment),
233-
incrementalPayment: _.isNil(r.incrementalPayment) ? null : Number(r.incrementalPayment),
231+
baseCoefficient: _.isNil(r.baseCoefficient) ? null : Number(r.baseCoefficient),
232+
incrementalCoefficient: _.isNil(r.incrementalCoefficient)
233+
? null
234+
: Number(r.incrementalCoefficient),
234235
aiWorkflowId: r.aiWorkflowId,
235236
shouldOpenOpportunity: _.isNil(r.shouldOpenOpportunity)
236237
? true
@@ -369,8 +370,8 @@ function convertModelToResponse(ret) {
369370
"isMemberReview",
370371
"memberReviewerCount",
371372
"phaseId",
372-
"basePayment",
373-
"incrementalPayment",
373+
"baseCoefficient",
374+
"incrementalCoefficient",
374375
"type",
375376
"aiWorkflowId",
376377
"shouldOpenOpportunity",

src/services/ChallengeService.js

Lines changed: 66 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -258,14 +258,12 @@ async function getDefaultReviewers(currentUser, criteria) {
258258
isMemberReview: r.isMemberReview,
259259
memberReviewerCount: r.memberReviewerCount,
260260
phaseName: r.phaseName,
261-
basePayment: r.basePayment,
262-
incrementalPayment: r.incrementalPayment,
261+
baseCoefficient: r.baseCoefficient,
262+
incrementalCoefficient: r.incrementalCoefficient,
263263
type: r.opportunityType,
264264
aiWorkflowId: r.aiWorkflowId,
265265
isAIReviewer: r.isAIReviewer,
266-
shouldOpenOpportunity: _.isBoolean(r.shouldOpenOpportunity)
267-
? r.shouldOpenOpportunity
268-
: true,
266+
shouldOpenOpportunity: _.isBoolean(r.shouldOpenOpportunity) ? r.shouldOpenOpportunity : true,
269267
}));
270268
}
271269
getDefaultReviewers.schema = { currentUser: Joi.any(), criteria: Joi.any() };
@@ -294,8 +292,8 @@ async function setDefaultReviewers(currentUser, data) {
294292
otherwise: Joi.forbidden(),
295293
}),
296294
phaseName: Joi.string().required(),
297-
basePayment: Joi.number().min(0).optional().allow(null),
298-
incrementalPayment: Joi.number().min(0).optional().allow(null),
295+
baseCoefficient: Joi.number().min(0).max(1).optional().allow(null),
296+
incrementalCoefficient: Joi.number().min(0).max(1).optional().allow(null),
299297
type: Joi.when("isMemberReview", {
300298
is: true,
301299
then: Joi.string().valid(_.values(ReviewOpportunityTypeEnum)).insensitive(),
@@ -354,9 +352,7 @@ async function setDefaultReviewers(currentUser, data) {
354352
where: {
355353
typeId: value.typeId,
356354
trackId: value.trackId,
357-
timelineTemplateId: _.isNil(value.timelineTemplateId)
358-
? null
359-
: value.timelineTemplateId,
355+
timelineTemplateId: _.isNil(value.timelineTemplateId) ? null : value.timelineTemplateId,
360356
},
361357
});
362358
if (value.reviewers.length > 0) {
@@ -365,18 +361,18 @@ async function setDefaultReviewers(currentUser, data) {
365361
...auditFields,
366362
typeId: value.typeId,
367363
trackId: value.trackId,
368-
timelineTemplateId: _.isNil(value.timelineTemplateId)
369-
? null
370-
: value.timelineTemplateId,
364+
timelineTemplateId: _.isNil(value.timelineTemplateId) ? null : value.timelineTemplateId,
371365
scorecardId: String(r.scorecardId),
372366
isMemberReview: !!r.isMemberReview,
373367
isAIReviewer: !!r.isAIReviewer,
374368
memberReviewerCount: _.isNil(r.memberReviewerCount)
375369
? null
376370
: Number(r.memberReviewerCount),
377371
phaseName: r.phaseName,
378-
basePayment: _.isNil(r.basePayment) ? null : Number(r.basePayment),
379-
incrementalPayment: _.isNil(r.incrementalPayment) ? null : Number(r.incrementalPayment),
372+
baseCoefficient: _.isNil(r.baseCoefficient) ? null : Number(r.baseCoefficient),
373+
incrementalCoefficient: _.isNil(r.incrementalCoefficient)
374+
? null
375+
: Number(r.incrementalCoefficient),
380376
opportunityType: r.type ? _.toUpper(r.type) : null,
381377
aiWorkflowId: r.aiWorkflowId,
382378
shouldOpenOpportunity: _.isNil(r.shouldOpenOpportunity)
@@ -484,9 +480,7 @@ async function searchChallenges(currentUser, criteria) {
484480
}
485481
const arrayValue = Array.isArray(list) ? list : [list];
486482
return _.uniq(
487-
arrayValue
488-
.map((value) => normalizeGroupIdValue(value))
489-
.filter((value) => !_.isNil(value))
483+
arrayValue.map((value) => normalizeGroupIdValue(value)).filter((value) => !_.isNil(value))
490484
);
491485
};
492486

@@ -1220,7 +1214,9 @@ async function createChallenge(currentUser, challenge, userToken) {
12201214
userToken
12211215
);
12221216
logger.info(
1223-
`createChallenge: self-service project created (projectId=${challenge.projectId}) ${buildLogContext()}`
1217+
`createChallenge: self-service project created (projectId=${
1218+
challenge.projectId
1219+
}) ${buildLogContext()}`
12241220
);
12251221
}
12261222

@@ -1286,10 +1282,10 @@ async function createChallenge(currentUser, challenge, userToken) {
12861282
logger.debug(`createChallenge: resolving challenge track/type ${buildLogContext()}`);
12871283
const { track, type } = await challengeHelper.validateAndGetChallengeTypeAndTrack(challenge);
12881284
logger.debug(
1289-
`createChallenge: resolved challenge track/type (trackId=${_.get(
1290-
track,
1285+
`createChallenge: resolved challenge track/type (trackId=${_.get(track, "id")}, typeId=${_.get(
1286+
type,
12911287
"id"
1292-
)}, typeId=${_.get(type, "id")}) ${buildLogContext()}`
1288+
)}) ${buildLogContext()}`
12931289
);
12941290

12951291
if (_.get(type, "isTask")) {
@@ -1311,7 +1307,9 @@ async function createChallenge(currentUser, challenge, userToken) {
13111307

13121308
if (challenge.phases && challenge.phases.length > 0) {
13131309
logger.debug(
1314-
`createChallenge: validating provided phases (count=${challenge.phases.length}) ${buildLogContext()}`
1310+
`createChallenge: validating provided phases (count=${
1311+
challenge.phases.length
1312+
}) ${buildLogContext()}`
13151313
);
13161314
await phaseHelper.validatePhases(challenge.phases);
13171315
logger.debug(`createChallenge: provided phases validated ${buildLogContext()}`);
@@ -1321,7 +1319,9 @@ async function createChallenge(currentUser, challenge, userToken) {
13211319
if (!challenge.timelineTemplateId) {
13221320
if (challenge.typeId && challenge.trackId) {
13231321
logger.debug(
1324-
`createChallenge: fetching default timeline template (trackId=${challenge.trackId}, typeId=${challenge.typeId}) ${buildLogContext()}`
1322+
`createChallenge: fetching default timeline template (trackId=${
1323+
challenge.trackId
1324+
}, typeId=${challenge.typeId}) ${buildLogContext()}`
13251325
);
13261326
const supportedTemplates =
13271327
await ChallengeTimelineTemplateService.searchChallengeTimelineTemplates({
@@ -1330,7 +1330,9 @@ async function createChallenge(currentUser, challenge, userToken) {
13301330
isDefault: true,
13311331
});
13321332
logger.debug(
1333-
`createChallenge: retrieved ${supportedTemplates.result.length} supported templates ${buildLogContext()}`
1333+
`createChallenge: retrieved ${
1334+
supportedTemplates.result.length
1335+
} supported templates ${buildLogContext()}`
13341336
);
13351337
const challengeTimelineTemplate = supportedTemplates.result[0];
13361338
if (!challengeTimelineTemplate) {
@@ -1340,14 +1342,18 @@ async function createChallenge(currentUser, challenge, userToken) {
13401342
}
13411343
challenge.timelineTemplateId = challengeTimelineTemplate.timelineTemplateId;
13421344
logger.debug(
1343-
`createChallenge: using timelineTemplateId=${challenge.timelineTemplateId} ${buildLogContext()}`
1345+
`createChallenge: using timelineTemplateId=${
1346+
challenge.timelineTemplateId
1347+
} ${buildLogContext()}`
13441348
);
13451349
} else {
13461350
throw new errors.BadRequestError(`trackId and typeId are required to create a challenge`);
13471351
}
13481352
}
13491353
logger.debug(
1350-
`createChallenge: populating phases for challenge creation (templateId=${challenge.timelineTemplateId}) ${buildLogContext()}`
1354+
`createChallenge: populating phases for challenge creation (templateId=${
1355+
challenge.timelineTemplateId
1356+
}) ${buildLogContext()}`
13511357
);
13521358
challenge.phases = await phaseHelper.populatePhasesForChallengeCreation(
13531359
challenge.phases,
@@ -1410,7 +1416,9 @@ async function createChallenge(currentUser, challenge, userToken) {
14101416
if (!challenge.reviewers || challenge.reviewers.length === 0) {
14111417
if (challenge.typeId && challenge.trackId) {
14121418
logger.debug(
1413-
`createChallenge: loading default reviewers (trackId=${challenge.trackId}, typeId=${challenge.typeId}) ${buildLogContext()}`
1419+
`createChallenge: loading default reviewers (trackId=${challenge.trackId}, typeId=${
1420+
challenge.typeId
1421+
}) ${buildLogContext()}`
14141422
);
14151423
const defaultReviewerWhere = {
14161424
typeId: challenge.typeId,
@@ -1458,13 +1466,14 @@ async function createChallenge(currentUser, challenge, userToken) {
14581466
memberReviewerCount: r.memberReviewerCount,
14591467
// connect reviewers to the Phase model via its id
14601468
phaseId: phaseMap.get(r.phaseName),
1461-
basePayment: r.basePayment,
1462-
incrementalPayment: r.incrementalPayment,
1469+
baseCoefficient: r.baseCoefficient,
1470+
incrementalCoefficient: r.incrementalCoefficient,
14631471
type: r.opportunityType,
14641472
aiWorkflowId: r.aiWorkflowId,
14651473
isAIReviewer: r.isAIReviewer ?? false,
1466-
shouldOpenOpportunity:
1467-
_.isBoolean(r.shouldOpenOpportunity) ? r.shouldOpenOpportunity : true,
1474+
shouldOpenOpportunity: _.isBoolean(r.shouldOpenOpportunity)
1475+
? r.shouldOpenOpportunity
1476+
: true,
14681477
}));
14691478
}
14701479
}
@@ -1482,9 +1491,7 @@ async function createChallenge(currentUser, challenge, userToken) {
14821491
data: prismaModel,
14831492
include: includeReturnFields,
14841493
});
1485-
logger.info(
1486-
`createChallenge: challenge record created (id=${ret.id}) ${buildLogContext()}`
1487-
);
1494+
logger.info(`createChallenge: challenge record created (id=${ret.id}) ${buildLogContext()}`);
14881495

14891496
ret.overview = { totalPrizes: ret.overviewTotalPrizes };
14901497
// No conversion needed - values are already in dollars in the database
@@ -1498,32 +1505,44 @@ async function createChallenge(currentUser, challenge, userToken) {
14981505
if (challenge.legacy.selfService) {
14991506
if (currentUser.handle) {
15001507
logger.debug(
1501-
`createChallenge: assigning CLIENT_MANAGER role to creator (challengeId=${ret.id}) ${buildLogContext()}`
1508+
`createChallenge: assigning CLIENT_MANAGER role to creator (challengeId=${
1509+
ret.id
1510+
}) ${buildLogContext()}`
15021511
);
15031512
await helper.createResource(ret.id, ret.createdBy, config.CLIENT_MANAGER_ROLE_ID);
15041513
logger.debug(
1505-
`createChallenge: CLIENT_MANAGER role assignment complete (challengeId=${ret.id}) ${buildLogContext()}`
1514+
`createChallenge: CLIENT_MANAGER role assignment complete (challengeId=${
1515+
ret.id
1516+
}) ${buildLogContext()}`
15061517
);
15071518
}
15081519
} else {
15091520
if (currentUser.handle) {
15101521
logger.debug(
1511-
`createChallenge: assigning MANAGER role to creator (challengeId=${ret.id}) ${buildLogContext()}`
1522+
`createChallenge: assigning MANAGER role to creator (challengeId=${
1523+
ret.id
1524+
}) ${buildLogContext()}`
15121525
);
15131526
await helper.createResource(ret.id, ret.createdBy, config.MANAGER_ROLE_ID);
15141527
logger.debug(
1515-
`createChallenge: MANAGER role assignment complete (challengeId=${ret.id}) ${buildLogContext()}`
1528+
`createChallenge: MANAGER role assignment complete (challengeId=${
1529+
ret.id
1530+
}) ${buildLogContext()}`
15161531
);
15171532
}
15181533
}
15191534

15201535
// post bus event
15211536
logger.info(
1522-
`createChallenge: posting bus event ${constants.Topics.ChallengeCreated} (challengeId=${ret.id}) ${buildLogContext()}`
1537+
`createChallenge: posting bus event ${constants.Topics.ChallengeCreated} (challengeId=${
1538+
ret.id
1539+
}) ${buildLogContext()}`
15231540
);
15241541
await helper.postBusEvent(constants.Topics.ChallengeCreated, ret);
15251542
logger.info(
1526-
`createChallenge: bus event posted ${constants.Topics.ChallengeCreated} (challengeId=${ret.id}) ${buildLogContext()}`
1543+
`createChallenge: bus event posted ${constants.Topics.ChallengeCreated} (challengeId=${
1544+
ret.id
1545+
}) ${buildLogContext()}`
15271546
);
15281547

15291548
return helper.removeNullProperties(ret);
@@ -1626,8 +1645,8 @@ createChallenge.schema = {
16261645
otherwise: Joi.forbidden(),
16271646
}),
16281647
phaseId: Joi.id().required(),
1629-
basePayment: Joi.number().min(0).optional(),
1630-
incrementalPayment: Joi.number().min(0).optional(),
1648+
baseCoefficient: Joi.number().min(0).optional(),
1649+
incrementalCoefficient: Joi.number().min(0).optional(),
16311650
type: Joi.when("isMemberReview", {
16321651
is: true,
16331652
then: Joi.string().valid(_.values(ReviewOpportunityTypeEnum)).insensitive(),
@@ -2769,8 +2788,8 @@ updateChallenge.schema = {
27692788
otherwise: Joi.forbidden(),
27702789
}),
27712790
phaseId: Joi.id().required(),
2772-
basePayment: Joi.number().min(0).optional().allow(null),
2773-
incrementalPayment: Joi.number().min(0).optional().allow(null),
2791+
baseCoefficient: Joi.number().min(0).optional().allow(null),
2792+
incrementalCoefficient: Joi.number().min(0).optional().allow(null),
27742793
type: Joi.when("isMemberReview", {
27752794
is: true,
27762795
then: Joi.string().valid(_.values(ReviewOpportunityTypeEnum)).insensitive(),
@@ -2968,8 +2987,8 @@ function sanitizeChallenge(challenge) {
29682987
"isAIReviewer",
29692988
"memberReviewerCount",
29702989
"phaseId",
2971-
"basePayment",
2972-
"incrementalPayment",
2990+
"baseCoefficient",
2991+
"incrementalCoefficient",
29732992
"type",
29742993
"aiWorkflowId",
29752994
])

0 commit comments

Comments
 (0)