@@ -314,7 +314,7 @@ router.get("/current", async function (req, res) {
314314 completed : false ,
315315 } )
316316 . sort ( { number : - 1 } )
317- . select ( "setups setupOrder number" )
317+ . select ( "setups setupOrder number numRounds " )
318318 . populate ( [
319319 {
320320 path : "setups" ,
@@ -341,10 +341,29 @@ router.get("/current", async function (req, res) {
341341 return ;
342342 }
343343
344+ // Fetch round settings for all rounds (filter out round 0 if it exists)
345+ const rounds = await models . CompetitiveRound . find ( {
346+ season : currentSeason . number ,
347+ number : { $gt : 0 } ,
348+ } )
349+ . select ( "number minimumPoints" )
350+ . sort ( { number : 1 } )
351+ . lean ( ) ;
352+
353+ // Build roundSettings object keyed by round number (1-indexed)
354+ const roundSettings = { } ;
355+ for ( const round of rounds ) {
356+ roundSettings [ round . number ] = {
357+ minimumPoints : round . minimumPoints ?? constants . minimumPointsForCompetitive ,
358+ } ;
359+ }
360+
344361 res . json ( {
345362 seasonNumber : currentSeason . number ,
346363 setups : currentSeason . setups ,
347364 setupOrder : currentSeason . setupOrder ,
365+ numRounds : currentSeason . numRounds ,
366+ roundSettings : roundSettings ,
348367 } ) ;
349368 } catch ( e ) {
350369 logger . error ( e ) ;
@@ -563,4 +582,82 @@ router.post("/updateSetupOrder", async function (req, res) {
563582 }
564583} ) ;
565584
585+ // Update round settings (minimumPoints) for the current season
586+ router . post ( "/updateRoundSettings" , async function ( req , res ) {
587+ try {
588+ var userId = await routeUtils . verifyLoggedIn ( req ) ;
589+
590+ if ( ! ( await routeUtils . verifyPermission ( res , userId , "manageCompetitive" ) ) )
591+ return ;
592+
593+ const roundSettings = req . body . roundSettings ;
594+
595+ if ( ! roundSettings || typeof roundSettings !== "object" ) {
596+ res . status ( 400 ) ;
597+ res . send ( "roundSettings must be an object." ) ;
598+ return ;
599+ }
600+
601+ const currentSeason = await models . CompetitiveSeason . findOne ( {
602+ completed : false ,
603+ } )
604+ . sort ( { number : - 1 } )
605+ . select ( "number numRounds" )
606+ . lean ( ) ;
607+
608+ if ( ! currentSeason ) {
609+ res . status ( 404 ) ;
610+ res . send ( "No season in progress." ) ;
611+ return ;
612+ }
613+
614+ // Get existing rounds for this season
615+ const existingRounds = await models . CompetitiveRound . find ( {
616+ season : currentSeason . number ,
617+ } )
618+ . select ( "number" )
619+ . lean ( ) ;
620+ const existingRoundNumbers = new Set ( existingRounds . map ( ( r ) => r . number ) ) ;
621+
622+ // Validate and update each round's settings
623+ for ( const [ roundNumberStr , settings ] of Object . entries ( roundSettings ) ) {
624+ const roundNumber = Number . parseInt ( roundNumberStr ) ;
625+
626+ if ( isNaN ( roundNumber ) || roundNumber < 1 || roundNumber > currentSeason . numRounds ) {
627+ res . status ( 400 ) ;
628+ res . send ( `Invalid round number: ${ roundNumberStr } ` ) ;
629+ return ;
630+ }
631+
632+ // Skip rounds that haven't been created yet
633+ if ( ! existingRoundNumbers . has ( roundNumber ) ) {
634+ continue ;
635+ }
636+
637+ if ( settings . minimumPoints !== undefined ) {
638+ const minPoints = Number . parseInt ( settings . minimumPoints ) ;
639+ if ( isNaN ( minPoints ) || minPoints < 0 ) {
640+ res . status ( 400 ) ;
641+ res . send ( `Invalid minimumPoints for round ${ roundNumber } : must be a non-negative number.` ) ;
642+ return ;
643+ }
644+
645+ // Update the round document
646+ await models . CompetitiveRound . updateOne (
647+ { season : currentSeason . number , number : roundNumber } ,
648+ { $set : { minimumPoints : minPoints } }
649+ ) ;
650+ }
651+ }
652+
653+ routeUtils . createModAction ( userId , "Update Competitive Round Settings" , [ ] ) ;
654+
655+ res . sendStatus ( 200 ) ;
656+ } catch ( e ) {
657+ logger . error ( e ) ;
658+ res . status ( 500 ) ;
659+ res . send ( "Error updating round settings." ) ;
660+ }
661+ } ) ;
662+
566663module . exports = router ;
0 commit comments