Files
gridpilot.gg/apps/website/lib/command-models/protests/ProtestDecisionCommandModel.ts
2025-12-28 12:04:12 +01:00

70 lines
1.7 KiB
TypeScript

import { ApplyPenaltyCommandDTO } from '../../types/generated/ApplyPenaltyCommandDTO';
export interface ProtestDecisionData {
decision: 'uphold' | 'dismiss' | null;
penaltyType: string;
penaltyValue?: number;
stewardNotes: string;
}
export class ProtestDecisionCommandModel {
decision: 'uphold' | 'dismiss' | null = null;
penaltyType: string = 'time_penalty';
penaltyValue: number = 5;
stewardNotes: string = '';
constructor(initial: Partial<ProtestDecisionData> = {}) {
this.decision = initial.decision ?? null;
this.penaltyType = initial.penaltyType ?? 'time_penalty';
this.penaltyValue = initial.penaltyValue ?? 5;
this.stewardNotes = initial.stewardNotes ?? '';
}
get isValid(): boolean {
return this.decision !== null && this.stewardNotes.trim().length > 0;
}
get canSubmit(): boolean {
return this.isValid;
}
reset(): void {
this.decision = null;
this.penaltyType = 'time_penalty';
this.penaltyValue = 5;
this.stewardNotes = '';
}
toApplyPenaltyCommand(
raceId: string,
driverId: string,
stewardId: string,
protestId: string,
options?: {
requiresValue?: boolean;
defaultUpheldReason?: string;
defaultDismissedReason?: string;
},
): ApplyPenaltyCommandDTO {
const reason =
this.decision === 'uphold'
? (options?.defaultUpheldReason ?? 'Protest upheld')
: (options?.defaultDismissedReason ?? 'Protest dismissed');
const base: ApplyPenaltyCommandDTO = {
raceId,
driverId,
stewardId,
type: this.penaltyType,
reason,
protestId,
notes: this.stewardNotes,
};
if (options?.requiresValue) {
return { ...base, value: this.penaltyValue };
}
return base;
}
}