69 lines
2.5 KiB
TypeScript
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),
|
|
};
|
|
} |