71 lines
2.4 KiB
TypeScript
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>;
|