32 lines
1.5 KiB
TypeScript
32 lines
1.5 KiB
TypeScript
import { RulebookApiDto } from '@/lib/types/tbd/RulebookApiDto';
|
|
import { RulebookViewData } from '@/lib/view-data/RulebookViewData';
|
|
|
|
import { ViewDataBuilder } from "../../contracts/builders/ViewDataBuilder";
|
|
|
|
export class RulebookViewDataBuilder implements ViewDataBuilder<any, any> {
|
|
build(input: any): any {
|
|
return RulebookViewDataBuilder.build(input);
|
|
}
|
|
|
|
static build(
|
|
static build(apiDto: RulebookApiDto): RulebookViewData {
|
|
const primaryChampionship = apiDto.scoringConfig.championships.find(c => c.type === 'driver') ?? apiDto.scoringConfig.championships[0];
|
|
const positionPoints: { position: number; points: number }[] = primaryChampionship?.pointsPreview
|
|
.filter((p): p is { sessionType: string; position: number; points: number } => p.sessionType === primaryChampionship.sessionTypes[0])
|
|
.map(p => ({ position: p.position, points: p.points }))
|
|
.sort((a, b) => a.position - b.position) || [];
|
|
|
|
return {
|
|
leagueId: apiDto.leagueId,
|
|
gameName: apiDto.scoringConfig.gameName,
|
|
scoringPresetName: apiDto.scoringConfig.scoringPresetName,
|
|
championshipsCount: apiDto.scoringConfig.championships.length,
|
|
sessionTypes: primaryChampionship?.sessionTypes.join(', ') || 'Main',
|
|
dropPolicySummary: apiDto.scoringConfig.dropPolicySummary,
|
|
hasActiveDropPolicy: !apiDto.scoringConfig.dropPolicySummary.includes('All'),
|
|
positionPoints,
|
|
bonusPoints: primaryChampionship?.bonusSummary || [],
|
|
hasBonusPoints: (primaryChampionship?.bonusSummary.length || 0) > 0,
|
|
};
|
|
}
|
|
} |