Files
gridpilot.gg/lib/builders/view-data/DriverProfileViewDataBuilder.ts
2026-01-14 16:28:39 +01:00

85 lines
3.3 KiB
TypeScript

import type { GetDriverProfileOutputDTO } from '@/lib/types/generated/GetDriverProfileOutputDTO';
import type { DriverProfileViewData } from '@/lib/types/view-data/DriverProfileViewData';
export class DriverProfileViewDataBuilder {
static build(dto: GetDriverProfileOutputDTO): DriverProfileViewData {
return {
currentDriver: dto.currentDriver ? {
id: dto.currentDriver.id,
name: dto.currentDriver.name,
country: dto.currentDriver.country,
avatarUrl: dto.currentDriver.avatarUrl || '',
iracingId: dto.currentDriver.iracingId || null,
joinedAt: dto.currentDriver.joinedAt,
rating: dto.currentDriver.rating || null,
globalRank: dto.currentDriver.globalRank || null,
consistency: dto.currentDriver.consistency || null,
bio: dto.currentDriver.bio || null,
totalDrivers: dto.currentDriver.totalDrivers || null,
} : null,
stats: dto.stats ? {
totalRaces: dto.stats.totalRaces,
wins: dto.stats.wins,
podiums: dto.stats.podiums,
dnfs: dto.stats.dnfs,
avgFinish: dto.stats.avgFinish || null,
bestFinish: dto.stats.bestFinish || null,
worstFinish: dto.stats.worstFinish || null,
finishRate: dto.stats.finishRate || null,
winRate: dto.stats.winRate || null,
podiumRate: dto.stats.podiumRate || null,
percentile: dto.stats.percentile || null,
rating: dto.stats.rating || null,
consistency: dto.stats.consistency || null,
overallRank: dto.stats.overallRank || null,
} : null,
finishDistribution: dto.finishDistribution ? {
totalRaces: dto.finishDistribution.totalRaces,
wins: dto.finishDistribution.wins,
podiums: dto.finishDistribution.podiums,
topTen: dto.finishDistribution.topTen,
dnfs: dto.finishDistribution.dnfs,
other: dto.finishDistribution.other,
} : null,
teamMemberships: dto.teamMemberships.map(m => ({
teamId: m.teamId,
teamName: m.teamName,
teamTag: m.teamTag || null,
role: m.role,
joinedAt: m.joinedAt,
isCurrent: m.isCurrent,
})),
socialSummary: {
friendsCount: dto.socialSummary.friendsCount,
friends: dto.socialSummary.friends.map(f => ({
id: f.id,
name: f.name,
country: f.country,
avatarUrl: f.avatarUrl || '',
})),
},
extendedProfile: dto.extendedProfile ? {
socialHandles: dto.extendedProfile.socialHandles.map(h => ({
platform: h.platform,
handle: h.handle,
url: h.url,
})),
achievements: dto.extendedProfile.achievements.map(a => ({
id: a.id,
title: a.title,
description: a.description,
icon: a.icon,
rarity: a.rarity,
earnedAt: a.earnedAt,
})),
racingStyle: dto.extendedProfile.racingStyle,
favoriteTrack: dto.extendedProfile.favoriteTrack,
favoriteCar: dto.extendedProfile.favoriteCar,
timezone: dto.extendedProfile.timezone,
availableHours: dto.extendedProfile.availableHours,
lookingForTeam: dto.extendedProfile.lookingForTeam,
openToRequests: dto.extendedProfile.openToRequests,
} : null,
};
}
}