import type { IRaceRegistrationRepository } from '@gridpilot/racing/domain/repositories/IRaceRegistrationRepository'; import type { ILeagueMembershipRepository } from '@gridpilot/racing/domain/repositories/ILeagueMembershipRepository'; import type { RaceRegistration } from '@gridpilot/racing/domain/entities/RaceRegistration'; export interface RegisterForRaceCommand { raceId: string; leagueId: string; driverId: string; } export class RegisterForRaceUseCase { constructor( private readonly registrationRepository: IRaceRegistrationRepository, private readonly membershipRepository: ILeagueMembershipRepository, ) {} /** * Mirrors legacy registerForRace behavior: * - throws if already registered * - validates active league membership * - registers driver for race */ async execute(command: RegisterForRaceCommand): Promise { const { raceId, leagueId, driverId } = command; const alreadyRegistered = await this.registrationRepository.isRegistered(raceId, driverId); if (alreadyRegistered) { throw new Error('Already registered for this race'); } const membership = await this.membershipRepository.getMembership(leagueId, driverId); if (!membership || membership.status !== 'active') { throw new Error('Must be an active league member to register for races'); } const registration: RaceRegistration = { raceId, driverId, registeredAt: new Date(), }; await this.registrationRepository.register(registration); } }