Files
gridpilot.gg/apps/website/lib/builders/view-data/TeamsViewDataBuilder.ts
Marc Mintel 09632d004d
Some checks failed
CI / lint-typecheck (pull_request) Failing after 12s
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-26 22:16:33 +01:00

42 lines
1.5 KiB
TypeScript

import { NumberFormatter } from '@/lib/formatters/NumberFormatter';
import { RatingFormatter } from '@/lib/formatters/RatingFormatter';
import type { TeamListItemDTO } from '@/lib/types/generated/TeamListItemDTO';
import type { TeamSummaryData, TeamsViewData } from '@/lib/view-data/TeamsViewData';
import { ViewDataBuilder } from "../../contracts/builders/ViewDataBuilder";
type TeamsApiDto = {
teams: TeamListItemDTO[];
};
export class TeamsViewDataBuilder {
/**
* Transform API DTO to ViewData
*
* @param apiDto - The DTO from the service
* @returns ViewData for the teams page
*/
public static build(apiDto: TeamsApiDto): TeamsViewData {
const teams: TeamSummaryData[] = (apiDto.teams || []).map((team: TeamListItemDTO): TeamSummaryData => ({
teamId: team.id,
teamName: team.name,
memberCount: team.memberCount,
logoUrl: team.logoUrl || '',
ratingLabel: RatingFormatter.format(team.rating),
ratingValue: team.rating || 0,
winsLabel: NumberFormatter.format(team.totalWins || 0),
racesLabel: NumberFormatter.format(team.totalRaces || 0),
region: team.region || '',
isRecruiting: team.isRecruiting,
category: team.category || '',
performanceLevel: team.performanceLevel || '',
description: team.description || '',
countryCode: team.region || '', // Assuming region contains country code for now
}));
return { teams };
}
}
TeamsViewDataBuilder satisfies ViewDataBuilder<TeamsApiDto, TeamsViewData>;