import type { IRaceRepository } from '../../domain/repositories/IRaceRepository'; import type { ILeagueRepository } from '../../domain/repositories/ILeagueRepository'; import type { IRacesPagePresenter, RacesPageResultDTO, RacesPageViewModel, } from '@core/racing/application/presenters/IRacesPagePresenter'; import type { UseCase } from '@core/shared/application/UseCase'; export class GetRacesPageDataUseCase implements UseCase { constructor( private readonly raceRepository: IRaceRepository, private readonly leagueRepository: ILeagueRepository, ) {} async execute(_input: void, presenter: IRacesPagePresenter): Promise { presenter.reset(); const [allRaces, allLeagues] = await Promise.all([ this.raceRepository.findAll(), this.leagueRepository.findAll(), ]); const leagueMap = new Map(allLeagues.map(l => [l.id, l.name])); const races = allRaces .sort((a, b) => a.scheduledAt.getTime() - b.scheduledAt.getTime()) .map(race => ({ id: race.id, track: race.track, car: race.car, scheduledAt: race.scheduledAt.toISOString(), status: race.status, leagueId: race.leagueId, leagueName: leagueMap.get(race.leagueId) ?? 'Unknown League', strengthOfField: race.strengthOfField, isUpcoming: race.isUpcoming(), isLive: race.isLive(), isPast: race.isPast(), })); const dto: RacesPageResultDTO = { races, }; presenter.present(dto); } }