48 lines
1.6 KiB
TypeScript
48 lines
1.6 KiB
TypeScript
'use client';
|
|
|
|
import type { DriverLeaderboardItemDTO } from '@/lib/types/generated/DriverLeaderboardItemDTO';
|
|
import type { GetTeamsLeaderboardOutputDTO } from '@/lib/types/generated/GetTeamsLeaderboardOutputDTO';
|
|
import type { LeaderboardsViewData } from '@/lib/view-data/LeaderboardsViewData';
|
|
import type { ViewDataBuilder } from '@/lib/contracts/builders/ViewDataBuilder';
|
|
|
|
type LeaderboardsInputDTO = {
|
|
drivers: { drivers: DriverLeaderboardItemDTO[] };
|
|
teams: GetTeamsLeaderboardOutputDTO;
|
|
}
|
|
|
|
export class LeaderboardsViewDataBuilder {
|
|
public static build(apiDto: LeaderboardsInputDTO): LeaderboardsViewData {
|
|
return {
|
|
drivers: apiDto.drivers.drivers.map(driver => ({
|
|
id: driver.id,
|
|
name: driver.name,
|
|
rating: driver.rating,
|
|
skillLevel: driver.skillLevel,
|
|
nationality: driver.nationality,
|
|
wins: driver.wins,
|
|
podiums: driver.podiums,
|
|
racesCompleted: driver.racesCompleted,
|
|
rank: driver.rank,
|
|
avatarUrl: driver.avatarUrl || '',
|
|
position: driver.rank,
|
|
})),
|
|
teams: apiDto.teams.topTeams.map((team, index) => ({
|
|
id: team.id,
|
|
name: team.name,
|
|
tag: team.tag,
|
|
memberCount: team.memberCount,
|
|
category: undefined,
|
|
totalWins: team.totalWins || 0,
|
|
totalRaces: team.totalRaces || 0,
|
|
logoUrl: team.logoUrl || '',
|
|
position: index + 1,
|
|
isRecruiting: team.isRecruiting,
|
|
performanceLevel: team.performanceLevel || 'N/A',
|
|
rating: team.rating || 0,
|
|
})),
|
|
};
|
|
}
|
|
}
|
|
|
|
LeaderboardsViewDataBuilder satisfies ViewDataBuilder<LeaderboardsInputDTO, LeaderboardsViewData>;
|