Skip to content

Commit cdde864

Browse files
committed
Add scorecard and phase ID checks to the reviewer checks
1 parent f0a1e54 commit cdde864

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

src/services/ChallengeService.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2816,6 +2816,30 @@ async function updateChallenge(currentUser, challengeId, data, options = {}) {
28162816
: Array.isArray(challenge.reviewers)
28172817
? challenge.reviewers
28182818
: [];
2819+
2820+
const reviewersMissingFields = [];
2821+
effectiveReviewers.forEach((reviewer, index) => {
2822+
const hasScorecardId =
2823+
reviewer && !_.isNil(reviewer.scorecardId) && String(reviewer.scorecardId).trim() !== "";
2824+
const hasPhaseId =
2825+
reviewer && !_.isNil(reviewer.phaseId) && String(reviewer.phaseId).trim() !== "";
2826+
2827+
if (!hasScorecardId || !hasPhaseId) {
2828+
const missing = [];
2829+
if (!hasScorecardId) missing.push("scorecardId");
2830+
if (!hasPhaseId) missing.push("phaseId");
2831+
reviewersMissingFields.push(`reviewer[${index}] missing ${missing.join(" and ")}`);
2832+
}
2833+
});
2834+
2835+
if (reviewersMissingFields.length > 0) {
2836+
throw new errors.BadRequestError(
2837+
`Cannot activate challenge; reviewers are missing required fields: ${reviewersMissingFields.join(
2838+
"; "
2839+
)}`
2840+
);
2841+
}
2842+
28192843
const reviewerPhaseIds = new Set(
28202844
effectiveReviewers
28212845
.filter((reviewer) => reviewer && reviewer.phaseId)

test/unit/ChallengeService.test.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1316,6 +1316,38 @@ describe('challenge service unit tests', () => {
13161316
}
13171317
})
13181318

1319+
it('update challenge - prevent activating when reviewer is missing required fields', async () => {
1320+
const activationChallenge = await createActivationChallenge()
1321+
await prisma.challengeReviewer.create({
1322+
data: {
1323+
id: uuid(),
1324+
challengeId: activationChallenge.id,
1325+
scorecardId: '',
1326+
isMemberReview: false,
1327+
phaseId: data.phase.id,
1328+
aiWorkflowId: 'wf-missing',
1329+
createdBy: 'activation-test',
1330+
updatedBy: 'activation-test'
1331+
}
1332+
})
1333+
1334+
try {
1335+
await service.updateChallenge(
1336+
{ isMachine: true, sub: 'sub-activate', userId: 22838965 },
1337+
activationChallenge.id,
1338+
{
1339+
status: ChallengeStatusEnum.ACTIVE
1340+
}
1341+
)
1342+
} catch (e) {
1343+
should.equal(e.message.indexOf('reviewers are missing required fields') >= 0, true)
1344+
return
1345+
} finally {
1346+
await prisma.challenge.delete({ where: { id: activationChallenge.id } })
1347+
}
1348+
throw new Error('should not reach here')
1349+
})
1350+
13191351
it('update challenge - enforce reviewers for required phases', async () => {
13201352
const setup = await createChallengeWithRequiredReviewPhases()
13211353
try {

0 commit comments

Comments
 (0)