Files
gridpilot.gg/apps/website/lib/page-queries/page-queries/DriverRankingsPageQuery.ts
2026-01-14 02:02:24 +01:00

77 lines
2.6 KiB
TypeScript

import { DriversApiClient } from '@/lib/api/drivers/DriversApiClient';
import type { PageQueryResult } from '@/lib/contracts/page-queries/PageQueryResult';
import { ConsoleErrorReporter } from '@/lib/infrastructure/logging/ConsoleErrorReporter';
import { ConsoleLogger } from '@/lib/infrastructure/logging/ConsoleLogger';
import type { DriverRankingsPageDto } from '@/lib/page-queries/page-dtos/DriverRankingsPageDto';
import type { DriverLeaderboardItemDTO } from '@/lib/types/generated/DriverLeaderboardItemDTO';
interface ErrorWithStatusCode extends Error {
statusCode?: number;
}
/**
* Transform DriverLeaderboardItemDTO to DriverRankingsPageDto
*/
function transformDtoToPageDto(dto: { drivers: DriverLeaderboardItemDTO[] }): DriverRankingsPageDto {
return {
drivers: dto.drivers.map(driver => ({
id: driver.id,
name: driver.name,
rating: driver.rating,
skillLevel: driver.skillLevel,
nationality: driver.nationality,
racesCompleted: driver.racesCompleted,
wins: driver.wins,
podiums: driver.podiums,
isActive: driver.isActive,
rank: driver.rank,
avatarUrl: driver.avatarUrl || '',
})),
};
}
/**
* Driver Rankings page query with manual wiring
* Returns PageQueryResult<DriverRankingsPageDto>
*/
export class DriverRankingsPageQuery {
/**
* Execute the driver rankings page query
*/
static async execute(): Promise<PageQueryResult<DriverRankingsPageDto>> {
try {
// Manual wiring
const errorReporter = new ConsoleErrorReporter();
const logger = new ConsoleLogger();
const baseUrl = process.env.NEXT_PUBLIC_API_URL || '';
const apiClient = new DriversApiClient(baseUrl, errorReporter, logger);
// Fetch data
const dto = await apiClient.getLeaderboard();
if (!dto || !dto.drivers) {
return { status: 'notFound' };
}
// Transform to Page DTO
const pageDto = transformDtoToPageDto(dto);
return { status: 'ok', dto: pageDto };
} catch (error) {
if (error instanceof Error) {
const errorWithStatus = error as ErrorWithStatusCode;
if (errorWithStatus.message?.includes('not found') || errorWithStatus.statusCode === 404) {
return { status: 'notFound' };
}
if (errorWithStatus.message?.includes('redirect') || errorWithStatus.statusCode === 302) {
return { status: 'redirect', to: '/' };
}
return { status: 'error', errorId: 'DRIVER_RANKINGS_FETCH_FAILED' };
}
return { status: 'error', errorId: 'UNKNOWN_ERROR' };
}
}
}