/** * 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;