view models

This commit is contained in:
2025-12-18 00:08:47 +01:00
parent f7a56a92ce
commit 7c449af311
56 changed files with 2594 additions and 206 deletions

View File

@@ -1,34 +1,35 @@
import { RaceResultsDetailDto, RaceResultDto } from '../dtos';
import { RaceResultsDetailDTO } from '../types/generated/RaceResultsDetailDTO';
import { RaceResultDTO } from '../types/generated/RaceResultDTO';
import { RaceResultViewModel } from './RaceResultViewModel';
export class RaceResultsDetailViewModel implements RaceResultsDetailDto {
export class RaceResultsDetailViewModel implements RaceResultsDetailDTO {
raceId: string;
track: string;
results: RaceResultViewModel[];
league?: { id: string; name: string };
race?: { id: string; track: string; scheduledAt: string };
drivers: { id: string; name: string }[];
pointsSystem: Record<number, number>;
fastestLapTime: number;
penalties: { driverId: string; type: string; value?: number }[];
currentDriverId: string;
private currentUserId: string;
constructor(dto: RaceResultsDetailDto & { results: RaceResultDto[] }, currentUserId: string) {
constructor(dto: RaceResultsDetailDTO & { results?: RaceResultDTO[] }, currentUserId: string) {
this.raceId = dto.raceId;
this.track = dto.track;
this.results = dto.results.map(r => new RaceResultViewModel({ ...r, raceId: dto.raceId }));
this.league = dto.league;
this.race = dto.race;
this.drivers = dto.drivers;
this.pointsSystem = dto.pointsSystem;
this.fastestLapTime = dto.fastestLapTime;
this.penalties = dto.penalties;
this.currentDriverId = dto.currentDriverId;
this.currentUserId = currentUserId;
// Map results if provided
if (dto.results) {
this.results = dto.results.map(r => new RaceResultViewModel(r));
}
}
// Note: The generated DTO is incomplete
// These fields will need to be added when the OpenAPI spec is updated
results: RaceResultViewModel[] = [];
league?: { id: string; name: string };
race?: { id: string; track: string; scheduledAt: string };
drivers: { id: string; name: string }[] = [];
pointsSystem: Record<number, number> = {};
fastestLapTime: number = 0;
penalties: { driverId: string; type: string; value?: number }[] = [];
currentDriverId: string = '';
/** UI-specific: Results sorted by position */
get resultsByPosition(): RaceResultViewModel[] {
return [...this.results].sort((a, b) => a.position - b.position);