import type { IRaceRepository } from '../../domain/repositories/IRaceRepository'; import type { ILeagueRepository } from '../../domain/repositories/ILeagueRepository'; import type { IRacesPagePresenter } from '@gridpilot/racing/application/presenters/IRacesPagePresenter'; export class GetRacesPageDataUseCase { constructor( private readonly raceRepository: IRaceRepository, private readonly leagueRepository: ILeagueRepository, public readonly presenter: IRacesPagePresenter, ) {} async execute(): Promise { 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(), })); this.presenter.present(races); } }