/** * Domain Entity: RaceRegistration * * Represents a registration of a driver for a specific race. */ import type { IEntity } from '@gridpilot/shared/domain'; import { RacingDomainValidationError } from '../errors/RacingDomainError'; export interface RaceRegistrationProps { id?: string; raceId: string; driverId: string; registeredAt?: Date; } export class RaceRegistration implements IEntity { readonly id: string; readonly raceId: string; readonly driverId: string; readonly registeredAt: Date; private constructor(props: Required) { this.id = props.id; this.raceId = props.raceId; this.driverId = props.driverId; this.registeredAt = props.registeredAt; } static create(props: RaceRegistrationProps): RaceRegistration { this.validate(props); const id = props.id && props.id.trim().length > 0 ? props.id : `${props.raceId}:${props.driverId}`; const registeredAt = props.registeredAt ?? new Date(); return new RaceRegistration({ id, raceId: props.raceId, driverId: props.driverId, registeredAt, }); } private static validate(props: RaceRegistrationProps): void { if (!props.raceId || props.raceId.trim().length === 0) { throw new RacingDomainValidationError('Race ID is required'); } if (!props.driverId || props.driverId.trim().length === 0) { throw new RacingDomainValidationError('Driver ID is required'); } } }