Files
gridpilot.gg/apps/website/lib/command-models/leagues/RaceScheduleCommandModel.ts
2026-01-16 01:40:01 +01:00

55 lines
1.4 KiB
TypeScript

/**
* RaceScheduleCommandModel
*
* UX-only model for managing race creation/editing state.
*/
export interface RaceScheduleFormData {
track: string;
car: string;
scheduledAtIso: string;
}
export interface RaceScheduleValidationErrors {
track?: string;
car?: string;
scheduledAtIso?: string;
}
export class RaceScheduleCommandModel {
private _track: string;
private _car: string;
private _scheduledAtIso: string;
constructor(initial: Partial<RaceScheduleFormData> = {}) {
this._track = initial.track || '';
this._car = initial.car || '';
this._scheduledAtIso = initial.scheduledAtIso || '';
}
get track(): string { return this._track; }
set track(value: string) { this._track = value; }
get car(): string { return this._car; }
set car(value: string) { this._car = value; }
get scheduledAtIso(): string { return this._scheduledAtIso; }
set scheduledAtIso(value: string) { this._scheduledAtIso = value; }
validate(): RaceScheduleValidationErrors {
const errors: RaceScheduleValidationErrors = {};
if (!this._track.trim()) errors.track = 'Track is required';
if (!this._car.trim()) errors.car = 'Car is required';
if (!this._scheduledAtIso) errors.scheduledAtIso = 'Date and time are required';
return errors;
}
toCommand(): { track: string; car: string; scheduledAtIso: string } {
return {
track: this._track,
car: this._car,
scheduledAtIso: this._scheduledAtIso,
};
}
}