Files
gridpilot.gg/apps/website/lib/builders/view-data/LeagueRosterAdminViewDataBuilder.ts
2026-01-26 17:56:11 +01:00

52 lines
1.8 KiB
TypeScript

import type { ViewDataBuilder } from '@/lib/contracts/builders/ViewDataBuilder';
import { DateFormatter } from '@/lib/formatters/DateFormatter';
import type { LeagueRosterJoinRequestDTO } from '@/lib/types/generated/LeagueRosterJoinRequestDTO';
import type { LeagueRosterMemberDTO } from '@/lib/types/generated/LeagueRosterMemberDTO';
import type { JoinRequestData, LeagueRosterAdminViewData, RosterMemberData } from '@/lib/view-data/LeagueRosterAdminViewData';
type LeagueRosterAdminInputDTO = {
leagueId: string;
members: LeagueRosterMemberDTO[];
joinRequests: LeagueRosterJoinRequestDTO[];
}
export class LeagueRosterAdminViewDataBuilder {
public static build(apiDto: LeagueRosterAdminInputDTO): LeagueRosterAdminViewData {
const { leagueId, members, joinRequests } = apiDto;
// Transform members
const rosterMembers: RosterMemberData[] = members.map(member => ({
driverId: member.driverId,
driver: {
id: member.driverId,
name: (member.driver as { name?: string })?.name || 'Unknown Driver',
},
role: member.role,
joinedAt: member.joinedAt,
formattedJoinedAt: DateFormatter.formatShort(member.joinedAt),
}));
// Transform join requests
const requests: JoinRequestData[] = joinRequests.map(req => ({
id: req.id,
driver: {
id: req.driverId,
name: (req as { driver?: { name?: string } }).driver?.name || 'Unknown Driver',
},
requestedAt: req.requestedAt,
formattedRequestedAt: DateFormatter.formatShort(req.requestedAt),
message: req.message ?? undefined,
}));
return {
leagueId,
members: rosterMembers,
joinRequests: requests,
};
}
}
LeagueRosterAdminViewDataBuilder satisfies ViewDataBuilder<LeagueRosterAdminInputDTO, LeagueRosterAdminViewData>;