From 8fe9693ba2485e307f9b1aae12e0ff4cfa729408 Mon Sep 17 00:00:00 2001 From: brandonw504 Date: Thu, 18 Apr 2024 15:03:54 -0700 Subject: [PATCH] Updated team API validation --- app/(api)/_data/tracks.json | 2 +- app/(api)/_datalib/teams/createTeams.ts | 9 ++++++++- app/(api)/_schema/Team.mjs | 2 +- app/(api)/_utils/scoring/calculateScore.ts | 1 - 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/(api)/_data/tracks.json b/app/(api)/_data/tracks.json index d29ec70e..91e477fc 100644 --- a/app/(api)/_data/tracks.json +++ b/app/(api)/_data/tracks.json @@ -2,7 +2,7 @@ { "name": "Best Hack for Social Good", "weights": [0.5, 0.1, 0.1, 0.2, 0.1], - "type": "general" + "type": "all" }, { "name": "Best Beginner Hack", diff --git a/app/(api)/_datalib/teams/createTeams.ts b/app/(api)/_datalib/teams/createTeams.ts index df3aaa0a..b0a591d0 100644 --- a/app/(api)/_datalib/teams/createTeams.ts +++ b/app/(api)/_datalib/teams/createTeams.ts @@ -18,16 +18,23 @@ export const createTeams = async (body: object[]) => { const parsedBody = await parseAndReplace(body); parsedBody.forEach((team: Team) => { + const seenTracks = new Set(); team.tracks.forEach((chosenTrack) => { const foundTrack = tracks.find((track) => track.name === chosenTrack); if (foundTrack == undefined) { throw new BadRequestError('Invalid track'); + } else if (seenTracks.has(foundTrack.name)) { + throw new BadRequestError('Duplicate track'); } else if (foundTrack.name === 'Best Hack for Social Good') { throw new BadRequestError( - 'Invalid track: Best Hack for Social Good should not be included' + 'Remove default track: Best Hack for Social Good' ); } + seenTracks.add(chosenTrack); }); + + // automatically add Best Hack for Social Good + team.tracks.push('Best Hack for Social Good'); }); const db = await getDatabase(); diff --git a/app/(api)/_schema/Team.mjs b/app/(api)/_schema/Team.mjs index eae262a8..72ee296a 100644 --- a/app/(api)/_schema/Team.mjs +++ b/app/(api)/_schema/Team.mjs @@ -19,7 +19,7 @@ const Team = { }, tracks: { bsonType: 'array', - maxItems: 3, + maxItems: 4, items: { enum: tracks.map((track) => track.name), description: 'track must be one of the valid tracks', diff --git a/app/(api)/_utils/scoring/calculateScore.ts b/app/(api)/_utils/scoring/calculateScore.ts index 0fb5ea62..0a7ebbb0 100644 --- a/app/(api)/_utils/scoring/calculateScore.ts +++ b/app/(api)/_utils/scoring/calculateScore.ts @@ -10,7 +10,6 @@ export default function calculateScore( scores: number[], correlations: Correlation[] ) { - chosenTracks.push('Best Hack for Social Good'); const finalScores = chosenTracks.map((chosenTrack) => { const weights = tracks.find((track) => track.name == chosenTrack); const score = weights?.weights.reduce((sum, weight, i) => {