import { redirect } from 'next/navigation'; import { routes } from '@/lib/routing/RouteConfig'; import { FeatureFlagService } from '@/lib/feature/FeatureFlagService'; // API Clients import { AuthApiClient } from '@/lib/api/auth/AuthApiClient'; import { RacesApiClient } from '@/lib/api/races/RacesApiClient'; import { LeaguesApiClient } from '@/lib/api/leagues/LeaguesApiClient'; import { TeamsApiClient } from '@/lib/api/teams/TeamsApiClient'; // Services import { SessionService } from '@/lib/services/auth/SessionService'; // Infrastructure import { ConsoleLogger } from '@/lib/infrastructure/logging/ConsoleLogger'; import { ConsoleErrorReporter } from '@/lib/infrastructure/logging/ConsoleErrorReporter'; // DTO types import type { RacesPageDataRaceDTO } from '@/lib/types/generated/RacesPageDataRaceDTO'; import type { LeagueWithCapacityDTO } from '@/lib/types/generated/LeagueWithCapacityDTO'; import type { TeamListItemDTO } from '@/lib/types/generated/TeamListItemDTO'; export interface HomeDataDTO { isAlpha: boolean; upcomingRaces: RacesPageDataRaceDTO[]; topLeagues: LeagueWithCapacityDTO[]; teams: TeamListItemDTO[]; } export async function getHomeData(): Promise { // Manual wiring: construct dependencies explicitly const baseUrl = process.env.NEXT_PUBLIC_API_URL || ''; const errorReporter = new ConsoleErrorReporter(); const logger = new ConsoleLogger(); // Construct API clients const authApiClient = new AuthApiClient(baseUrl, errorReporter, logger); const racesApiClient = new RacesApiClient(baseUrl, errorReporter, logger); const leaguesApiClient = new LeaguesApiClient(baseUrl, errorReporter, logger); const teamsApiClient = new TeamsApiClient(baseUrl, errorReporter, logger); // Construct services const sessionService = new SessionService(authApiClient); // Check session and redirect if logged in const session = await sessionService.getSession(); if (session) { redirect(routes.protected.dashboard); } // Get feature flags const featureService = await FeatureFlagService.fromAPI(); const isAlpha = featureService.isEnabled('alpha_features'); // Get home discovery data (manual implementation) const [racesDto, leaguesDto, teamsDto] = await Promise.all([ racesApiClient.getPageData(), leaguesApiClient.getAllWithCapacity(), teamsApiClient.getAll(), ]); // Return DTOs directly (no ViewModels) return { isAlpha, upcomingRaces: racesDto.races.slice(0, 4), topLeagues: leaguesDto.leagues.slice(0, 4), teams: teamsDto.teams.slice(0, 4), }; }