Files
gridpilot.gg/apps/website/lib/builders/view-data/RaceResultsViewDataBuilder.ts
Marc Mintel 046852703f
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 5m51s
Contract Testing / contract-snapshot (pull_request) Has been skipped
view data fixes
2026-01-24 12:14:08 +01:00

71 lines
2.4 KiB
TypeScript

/**
* Race Results View Data Builder
*
* Transforms API DTO to ViewData for templates.
*/
import type { RaceResultsDetailDTO } from '@/lib/types/generated/RaceResultsDetailDTO';
import type { RaceResultsPenalty, RaceResultsResult, RaceResultsViewData } from '@/lib/view-data/RaceResultsViewData';
import { ViewDataBuilder } from "../../contracts/builders/ViewDataBuilder";
export class RaceResultsViewDataBuilder {
/**
* Transform API DTO to ViewData
*
* @param apiDto - The DTO from the service
* @returns ViewData for the race results page
*/
public static build(apiDto: RaceResultsDetailDTO): RaceResultsViewData {
if (!apiDto) {
return {
raceSOF: null,
results: [],
penalties: [],
pointsSystem: {},
fastestLapTime: 0,
};
}
// Transform results
const results: RaceResultsResult[] = (apiDto.results || []).map((result: any) => ({
position: result.position,
driverId: result.driverId,
driverName: result.driverName,
driverAvatar: result.avatarUrl || '',
country: result.country || 'US',
car: result.car || 'Unknown',
laps: result.laps || 0,
time: result.time || '0:00.00',
fastestLap: result.fastestLap?.toString() || '0.00',
points: result.points || 0,
incidents: result.incidents || 0,
isCurrentUser: result.isCurrentUser || false,
}));
// Transform penalties
const penalties: RaceResultsPenalty[] = ((apiDto as any).penalties || []).map((penalty: any) => ({
driverId: penalty.driverId,
driverName: penalty.driverName || 'Unknown',
type: penalty.type as 'time_penalty' | 'grid_penalty' | 'points_deduction' | 'disqualification' | 'warning' | 'license_points',
value: penalty.value || 0,
reason: penalty.reason || 'Penalty applied',
notes: penalty.notes,
}));
return {
raceTrack: apiDto.track || (apiDto as any).race?.track,
raceScheduledAt: (apiDto as any).race?.scheduledAt,
totalDrivers: (apiDto as any).stats?.totalDrivers,
leagueName: (apiDto as any).league?.name,
raceSOF: (apiDto as any).strengthOfField || null,
results,
penalties,
pointsSystem: (apiDto as any).pointsSystem || {},
fastestLapTime: (apiDto as any).fastestLapTime || 0,
};
}
}
RaceResultsViewDataBuilder satisfies ViewDataBuilder<RaceResultsDetailDTO, RaceResultsViewData>;