39 lines
1.6 KiB
TypeScript
39 lines
1.6 KiB
TypeScript
import type { AllLeaguesWithCapacityAndScoringDTO } from '@/lib/types/generated/AllLeaguesWithCapacityAndScoringDTO';
|
|
import type { LeaguesViewData } from '@/lib/view-data/LeaguesViewData';
|
|
|
|
/**
|
|
* LeaguesViewDataBuilder
|
|
*
|
|
* Transforms AllLeaguesWithCapacityAndScoringDTO (API DTO) into LeaguesViewData for server-side rendering.
|
|
* Deterministic; side-effect free; no HTTP calls.
|
|
*/
|
|
export class LeaguesViewDataBuilder {
|
|
static build(apiDto: AllLeaguesWithCapacityAndScoringDTO): LeaguesViewData {
|
|
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,
|
|
usedDriverSlots: league.usedSlots,
|
|
maxTeams: undefined, // Not provided in DTO
|
|
usedTeamSlots: undefined, // Not provided in DTO
|
|
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,
|
|
scoringPresetId: league.scoring.scoringPresetId,
|
|
scoringPresetName: league.scoring.scoringPresetName,
|
|
dropPolicySummary: league.scoring.dropPolicySummary,
|
|
scoringPatternSummary: league.scoring.scoringPatternSummary,
|
|
} : undefined,
|
|
})),
|
|
};
|
|
}
|
|
} |