From ddbd99b747c4b9ff3c30d2f067d1dbade266ca0f Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Fri, 12 Dec 2025 15:20:17 +0100 Subject: [PATCH] wip --- packages/racing/domain/entities/League.ts | 5 +++-- packages/racing/domain/entities/Season.ts | 2 +- .../domain/value-objects/SeasonStewardingConfig.ts | 13 ++++++++++++- tests/unit/racing/domain/Season.test.ts | 3 --- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/racing/domain/entities/League.ts b/packages/racing/domain/entities/League.ts index f450be2de..2e605d218 100644 --- a/packages/racing/domain/entities/League.ts +++ b/packages/racing/domain/entities/League.ts @@ -9,10 +9,11 @@ import { RacingDomainValidationError } from '../errors/RacingDomainError'; import type { IEntity } from '@gridpilot/shared/domain'; /** - * Stewarding decision mode for protests - */ +* Stewarding decision mode for protests +*/ export type StewardingDecisionMode = | 'admin_only' // Only admins can decide + | 'steward_decides' // Single steward makes decision | 'steward_vote' // X stewards must vote to uphold | 'member_vote' // X members must vote to uphold | 'steward_veto' // Upheld unless X stewards vote against diff --git a/packages/racing/domain/entities/Season.ts b/packages/racing/domain/entities/Season.ts index 178b65023..7de0b5263 100644 --- a/packages/racing/domain/entities/Season.ts +++ b/packages/racing/domain/entities/Season.ts @@ -72,7 +72,7 @@ export class Season implements IEntity { order?: number; status?: SeasonStatus; startDate?: Date; - endDate?: Date; + endDate?: Date | undefined; schedule?: SeasonSchedule; scoringConfig?: SeasonScoringConfig; dropPolicy?: SeasonDropPolicy; diff --git a/packages/racing/domain/value-objects/SeasonStewardingConfig.ts b/packages/racing/domain/value-objects/SeasonStewardingConfig.ts index 5528e0d4e..29409b3da 100644 --- a/packages/racing/domain/value-objects/SeasonStewardingConfig.ts +++ b/packages/racing/domain/value-objects/SeasonStewardingConfig.ts @@ -4,7 +4,7 @@ import type { StewardingDecisionMode } from '../entities/League'; export interface SeasonStewardingConfigProps { decisionMode: StewardingDecisionMode; - requiredVotes?: number; + requiredVotes?: number | undefined; requireDefense: boolean; defenseTimeLimit: number; voteTimeLimit: number; @@ -54,6 +54,17 @@ export class SeasonStewardingConfig ); } + // For non-voting modes, requiredVotes should not be provided + if (props.decisionMode !== 'steward_vote' && + props.decisionMode !== 'member_vote' && + props.decisionMode !== 'steward_veto' && + props.decisionMode !== 'member_veto' && + props.requiredVotes !== undefined) { + throw new RacingDomainValidationError( + 'SeasonStewardingConfig.requiredVotes should only be provided for voting/veto modes', + ); + } + if (!Number.isInteger(props.defenseTimeLimit) || props.defenseTimeLimit < 0) { throw new RacingDomainValidationError( 'SeasonStewardingConfig.defenseTimeLimit must be a non-negative integer (hours)', diff --git a/tests/unit/racing/domain/Season.test.ts b/tests/unit/racing/domain/Season.test.ts index 468669bc7..ec60a832b 100644 --- a/tests/unit/racing/domain/Season.test.ts +++ b/tests/unit/racing/domain/Season.test.ts @@ -253,7 +253,6 @@ describe('SeasonScoringConfig', () => { expect( () => new SeasonScoringConfig({ - // @ts-expect-error intentional invalid input scoringPresetId: ' ', }), ).toThrow(RacingDomainValidationError); @@ -395,8 +394,6 @@ describe('SeasonStewardingConfig', () => { () => new SeasonStewardingConfig({ decisionMode: mode, - // @ts-expect-error intentional invalid - requiredVotes: undefined, requireDefense: true, defenseTimeLimit: 24, voteTimeLimit: 24,