52 lines
1.8 KiB
TypeScript
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>;
|