website refactor

This commit is contained in:
2026-01-14 13:39:24 +01:00
parent faa4c3309e
commit 8b67295442
28 changed files with 1082 additions and 851 deletions

View File

@@ -1,39 +1,29 @@
import type { LeagueScheduleDTO } from '@/lib/types/generated/LeagueScheduleDTO';
import type { LeagueSeasonSummaryDTO } from '@/lib/types/generated/LeagueSeasonSummaryDTO';
import type { LeagueScheduleViewData, ScheduleRaceData } from '@/lib/view-data/LeagueScheduleViewData';
import { LeagueScheduleViewData } from '@/lib/view-data/leagues/LeagueScheduleViewData';
import { LeagueScheduleApiDto } from '@/lib/types/tbd/LeagueScheduleApiDto';
/**
* LeagueScheduleViewDataBuilder
*
* Transforms API DTOs into LeagueScheduleViewData for server-side rendering.
* Deterministic; side-effect free; no HTTP calls.
*/
export class LeagueScheduleViewDataBuilder {
static build(input: {
schedule: LeagueScheduleDTO;
seasons: LeagueSeasonSummaryDTO[];
leagueId: string;
}): LeagueScheduleViewData {
const { schedule, seasons, leagueId } = input;
// Transform races - using available fields from RaceDTO
const races: ScheduleRaceData[] = (schedule.races || []).map(race => ({
id: race.id,
name: race.name,
track: race.leagueName || 'Unknown Track',
car: 'Unknown Car',
scheduledAt: race.date,
status: 'scheduled',
}));
static build(apiDto: LeagueScheduleApiDto): LeagueScheduleViewData {
const now = new Date();
return {
leagueId,
races,
seasons: seasons.map(s => ({
seasonId: s.seasonId,
name: s.name,
status: s.status,
})),
leagueId: apiDto.leagueId,
races: apiDto.races.map((race) => {
const scheduledAt = new Date(race.date);
const isPast = scheduledAt.getTime() < now.getTime();
const isUpcoming = !isPast;
return {
id: race.id,
name: race.name,
scheduledAt: race.date,
track: race.track,
car: race.car,
sessionType: race.sessionType,
isPast,
isUpcoming,
status: isPast ? 'completed' : 'scheduled',
};
}),
};
}
}

View File

@@ -0,0 +1,12 @@
import { LeagueSettingsViewData } from '@/lib/view-data/leagues/LeagueSettingsViewData';
import { LeagueSettingsApiDto } from '@/lib/types/tbd/LeagueSettingsApiDto';
export class LeagueSettingsViewDataBuilder {
static build(apiDto: LeagueSettingsApiDto): LeagueSettingsViewData {
return {
leagueId: apiDto.leagueId,
league: apiDto.league,
config: apiDto.config,
};
}
}

View File

@@ -0,0 +1,13 @@
import { LeagueSponsorshipsViewData } from '@/lib/view-data/leagues/LeagueSponsorshipsViewData';
import { LeagueSponsorshipsApiDto } from '@/lib/types/tbd/LeagueSponsorshipsApiDto';
export class LeagueSponsorshipsViewDataBuilder {
static build(apiDto: LeagueSponsorshipsApiDto): LeagueSponsorshipsViewData {
return {
leagueId: apiDto.leagueId,
league: apiDto.league,
sponsorshipSlots: apiDto.sponsorshipSlots,
sponsorshipRequests: apiDto.sponsorshipRequests,
};
}
}

View File

@@ -0,0 +1,13 @@
import { LeagueWalletViewData } from '@/lib/view-data/leagues/LeagueWalletViewData';
import { LeagueWalletApiDto } from '@/lib/types/tbd/LeagueWalletApiDto';
export class LeagueWalletViewDataBuilder {
static build(apiDto: LeagueWalletApiDto): LeagueWalletViewData {
return {
leagueId: apiDto.leagueId,
balance: apiDto.balance,
currency: apiDto.currency,
transactions: apiDto.transactions,
};
}
}