Files
gridpilot.gg/apps/website/lib/builders/view-data/TeamRankingsViewDataBuilder.ts
Marc Mintel 844092eb8c
Some checks failed
CI / lint-typecheck (pull_request) Failing after 13s
CI / tests (pull_request) Has been skipped
CI / contract-tests (pull_request) Has been skipped
CI / e2e-tests (pull_request) Has been skipped
CI / comment-pr (pull_request) Has been skipped
CI / commit-types (pull_request) Has been skipped
code quality
2026-01-27 18:29:33 +01:00

49 lines
1.6 KiB
TypeScript

/**
* Team Rankings View Data Builder
*
* Transforms API DTO to ViewData for templates.
*/
import type { GetTeamsLeaderboardOutputDTO } from '@/lib/types/generated/GetTeamsLeaderboardOutputDTO';
import type { TeamRankingsViewData } from '@/lib/view-data/TeamRankingsViewData';
import type { LeaderboardTeamItem } from '@/lib/view-data/LeaderboardTeamItem';
import { ViewDataBuilder } from "../../contracts/builders/ViewDataBuilder";
export class TeamRankingsViewDataBuilder {
/**
* Transform API DTO to ViewData
*
* @param apiDto - The DTO from the service
* @returns ViewData for the team rankings page
*/
public static build(apiDto: GetTeamsLeaderboardOutputDTO): TeamRankingsViewData {
const allTeams: LeaderboardTeamItem[] = (apiDto.teams || []).map((t, index) => ({
id: t.id,
name: t.name,
tag: t.tag,
memberCount: t.memberCount,
category: (t as unknown as { specialization: string }).specialization, // Mapping specialization to category as per LeaderboardTeamItem
totalWins: t.totalWins ?? 0,
totalRaces: t.totalRaces ?? 0,
logoUrl: t.logoUrl || '',
position: index + 1,
isRecruiting: t.isRecruiting,
performanceLevel: t.performanceLevel || 'N/A',
rating: t.rating ?? 0,
}));
return {
teams: allTeams,
podium: allTeams.slice(0, 3),
recruitingCount: apiDto.recruitingCount || 0,
searchQuery: '',
selectedSkill: 'all',
sortBy: 'rank',
showFilters: false,
};
}
}
TeamRankingsViewDataBuilder satisfies ViewDataBuilder<GetTeamsLeaderboardOutputDTO, TeamRankingsViewData>;