import { RacesApiClient } from '@/lib/api/races/RacesApiClient'; import { LeaguesApiClient } from '@/lib/api/leagues/LeaguesApiClient'; import { TeamsApiClient } from '@/lib/api/teams/TeamsApiClient'; import type { AllLeaguesWithCapacityDTO } from '@/lib/types/generated/AllLeaguesWithCapacityDTO'; import type { GetAllTeamsOutputDTO } from '@/lib/types/generated/GetAllTeamsOutputDTO'; import type { RacesPageDataDTO } from '@/lib/types/generated/RacesPageDataDTO'; import type { LeagueSummaryDTO } from '@/lib/types/generated/LeagueSummaryDTO'; import type { TeamListItemDTO } from '@/lib/types/generated/TeamListItemDTO'; import { RacesPageViewModel } from '@/lib/view-models/RacesPageViewModel'; import { HomeDiscoveryViewModel } from '@/lib/view-models/HomeDiscoveryViewModel'; import { LeagueCardViewModel } from '@/lib/view-models/LeagueCardViewModel'; import { TeamCardViewModel } from '@/lib/view-models/TeamCardViewModel'; import { UpcomingRaceCardViewModel } from '@/lib/view-models/UpcomingRaceCardViewModel'; export class LandingService { constructor( private readonly racesApi: RacesApiClient, private readonly leaguesApi: LeaguesApiClient, private readonly teamsApi: TeamsApiClient, ) {} async getHomeDiscovery(): Promise { const [racesDto, leaguesDto, teamsDto] = await Promise.all([ this.racesApi.getPageData() as Promise, this.leaguesApi.getAllWithCapacity() as Promise, this.teamsApi.getAll() as Promise, ]); const racesVm = new RacesPageViewModel(racesDto); const topLeagues = leaguesDto.leagues.slice(0, 4).map( (league: LeagueSummaryDTO) => new LeagueCardViewModel({ id: league.id, name: league.name, description: 'Competitive iRacing league', }), ); const teams = teamsDto.teams.slice(0, 4).map( (team: TeamListItemDTO) => new TeamCardViewModel({ id: team.id, name: team.name, tag: team.tag, description: team.description, }), ); const upcomingRaces = racesVm.upcomingRaces.slice(0, 4).map( race => new UpcomingRaceCardViewModel({ id: race.id, track: race.track, car: race.car, scheduledAt: race.scheduledAt, }), ); return new HomeDiscoveryViewModel({ topLeagues, teams, upcomingRaces, }); } }