Files
gridpilot.gg/apps/website/lib/services/home/getHomeData.ts
2026-01-14 10:51:05 +01:00

69 lines
2.5 KiB
TypeScript

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<HomeDataDTO> {
// 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),
};
}