import type { IRaceRegistrationRepository } from '@core/racing/domain/repositories/IRaceRegistrationRepository'; import type { ILeagueMembershipRepository } from '@core/racing/domain/repositories/ILeagueMembershipRepository'; import { RaceRegistration } from '@core/racing/domain/entities/RaceRegistration'; import type { RegisterForRaceCommandDTO } from '../dto/RegisterForRaceCommandDTO'; import type { AsyncUseCase } from '@core/shared/application'; import { Logger } from '@core/shared/logging/Logger'; import { BusinessRuleViolationError, PermissionDeniedError, } from '../errors/RacingApplicationError'; export class RegisterForRaceUseCase implements AsyncUseCase { constructor( private readonly registrationRepository: IRaceRegistrationRepository, private readonly membershipRepository: ILeagueMembershipRepository, private readonly logger: Logger, ) {} /** * Mirrors legacy registerForRace behavior: * - throws if already registered * - validates active league membership * - registers driver for race */ async execute(command: RegisterForRaceCommandDTO): Promise { const { raceId, leagueId, driverId } = command; this.logger.debug('RegisterForRaceUseCase: executing command', { raceId, leagueId, driverId }); const alreadyRegistered = await this.registrationRepository.isRegistered(raceId, driverId); if (alreadyRegistered) { this.logger.warn(`RegisterForRaceUseCase: driver ${driverId} already registered for race ${raceId}`); throw new BusinessRuleViolationError('Already registered for this race'); } const membership = await this.membershipRepository.getMembership(leagueId, driverId); if (!membership || membership.status !== 'active') { this.logger.error(`RegisterForRaceUseCase: driver ${driverId} not an active member of league ${leagueId}`); throw new PermissionDeniedError('NOT_ACTIVE_MEMBER', 'Must be an active league member to register for races'); } const registration = RaceRegistration.create({ raceId, driverId, }); await this.registrationRepository.register(registration); this.logger.info(`RegisterForRaceUseCase: driver ${driverId} successfully registered for race ${raceId}`); } }