Files
gridpilot.gg/apps/website/lib/builders/view-data/LeaguesViewDataBuilder.ts
2026-01-26 17:56:11 +01:00

43 lines
1.8 KiB
TypeScript

import type { ViewDataBuilder } from '@/lib/contracts/builders/ViewDataBuilder';
import type { AllLeaguesWithCapacityAndScoringDTO } from '@/lib/types/generated/AllLeaguesWithCapacityAndScoringDTO';
import type { LeaguesViewData } from '@/lib/view-data/LeaguesViewData';
export class LeaguesViewDataBuilder {
public static build(apiDto: AllLeaguesWithCapacityAndScoringDTO): LeaguesViewData {
if (!apiDto || !Array.isArray(apiDto.leagues)) {
return { leagues: [] };
}
return {
leagues: apiDto.leagues.map((league) => ({
id: league.id,
name: league.name,
description: league.description || null,
logoUrl: league.logoUrl || null,
ownerId: league.ownerId,
createdAt: league.createdAt,
maxDrivers: league.settings?.maxDrivers || 0,
usedDriverSlots: league.usedSlots,
activeDriversCount: undefined,
nextRaceAt: undefined,
maxTeams: undefined,
usedTeamSlots: undefined,
structureSummary: league.settings?.qualifyingFormat || '',
timingSummary: league.timingSummary || '',
category: league.category || null,
scoring: league.scoring ? {
gameId: league.scoring.gameId,
gameName: league.scoring.gameName,
primaryChampionshipType: league.scoring.primaryChampionshipType as "driver" | "team" | "nations" | "trophy",
scoringPresetId: league.scoring.scoringPresetId,
scoringPresetName: league.scoring.scoringPresetName,
dropPolicySummary: league.scoring.dropPolicySummary,
scoringPatternSummary: league.scoring.scoringPatternSummary,
} : undefined,
})),
};
}
}
LeaguesViewDataBuilder satisfies ViewDataBuilder<AllLeaguesWithCapacityAndScoringDTO, LeaguesViewData>;