Files
gridpilot.gg/apps/website/lib/builders/view-data/RaceDetailViewDataBuilder.ts
Marc Mintel d97f50ed72
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 6m4s
Contract Testing / contract-snapshot (pull_request) Has been skipped
view data fixes
2026-01-23 11:59:49 +01:00

89 lines
2.7 KiB
TypeScript

import { RaceDetailEntry, RaceDetailLeague, RaceDetailRace, RaceDetailRegistration, RaceDetailUserResult, RaceDetailViewData } from '@/lib/view-data/RaceDetailViewData';
/**
* Race Detail View Data Builder
*
* Transforms API DTO into ViewData for the race detail template.
* Deterministic, side-effect free.
*/
import { ViewDataBuilder } from "../../contracts/builders/ViewDataBuilder";
export class RaceDetailViewDataBuilder implements ViewDataBuilder<any, any> {
build(input: any): any {
return RaceDetailViewDataBuilder.build(input);
}
static build(
static build(apiDto: any): RaceDetailViewData {
if (!apiDto || !apiDto.race) {
return {
race: {
id: '',
track: '',
car: '',
scheduledAt: '',
status: 'scheduled',
sessionType: 'race',
},
entryList: [],
registration: {
isUserRegistered: false,
canRegister: false,
},
canReopenRace: false,
};
}
const race: RaceDetailRace = {
id: apiDto.race.id,
track: apiDto.race.track,
car: apiDto.race.car,
scheduledAt: apiDto.race.scheduledAt,
status: apiDto.race.status as 'scheduled' | 'running' | 'completed' | 'cancelled',
sessionType: apiDto.race.sessionType,
};
const league: RaceDetailLeague | undefined = apiDto.league ? {
id: apiDto.league.id,
name: apiDto.league.name,
description: apiDto.league.description || undefined,
settings: {
maxDrivers: apiDto.league.settings?.maxDrivers || 32,
qualifyingFormat: apiDto.league.settings?.qualifyingFormat || 'Open',
},
} : undefined;
const entryList: RaceDetailEntry[] = apiDto.entryList.map((entry: any) => ({
id: entry.id,
name: entry.name,
avatarUrl: entry.avatarUrl,
country: entry.country,
rating: entry.rating,
isCurrentUser: entry.isCurrentUser,
}));
const registration: RaceDetailRegistration = {
isUserRegistered: apiDto.registration.isUserRegistered,
canRegister: apiDto.registration.canRegister,
};
const userResult: RaceDetailUserResult | undefined = apiDto.userResult ? {
position: apiDto.userResult.position,
startPosition: apiDto.userResult.startPosition,
positionChange: apiDto.userResult.positionChange,
incidents: apiDto.userResult.incidents,
isClean: apiDto.userResult.isClean,
isPodium: apiDto.userResult.isPodium,
ratingChange: apiDto.userResult.ratingChange,
} : undefined;
return {
race,
league,
entryList,
registration,
userResult,
canReopenRace: apiDto.canReopenRace || false,
};
}
}