refactor
This commit is contained in:
@@ -1,7 +1,18 @@
|
||||
import type { TeamMembership, TeamRole } from '@gridpilot/racing/domain/types/TeamMembership';
|
||||
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
|
||||
import { EntityMappers } from '@gridpilot/racing/application/mappers/EntityMappers';
|
||||
import { getDriverRepository, getDriverStats } from '@/lib/di-container';
|
||||
/**
|
||||
* TeamRosterPresenter - Pure data transformer
|
||||
* Transforms API response to view model without DI dependencies.
|
||||
*/
|
||||
|
||||
import { apiClient } from '@/lib/apiClient';
|
||||
|
||||
export type TeamRole = 'owner' | 'manager' | 'driver' | 'member';
|
||||
|
||||
export interface DriverDTO {
|
||||
id: string;
|
||||
name: string;
|
||||
avatarUrl?: string | undefined;
|
||||
country?: string | undefined;
|
||||
}
|
||||
|
||||
export interface TeamRosterMemberViewModel {
|
||||
driver: DriverDTO;
|
||||
@@ -17,33 +28,24 @@ export interface TeamRosterViewModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Presenter/facade for team roster.
|
||||
* Encapsulates repository and stats access so the TeamRoster component can remain a pure view.
|
||||
* Fetch team roster via API and transform to view model.
|
||||
*/
|
||||
export async function getTeamRosterViewModel(
|
||||
memberships: TeamMembership[]
|
||||
teamId: string
|
||||
): Promise<TeamRosterViewModel> {
|
||||
const driverRepo = getDriverRepository();
|
||||
const allDrivers = await driverRepo.findAll();
|
||||
const members: TeamRosterMemberViewModel[] = [];
|
||||
|
||||
for (const membership of memberships) {
|
||||
const driver = allDrivers.find((d) => d.id === membership.driverId);
|
||||
if (!driver) continue;
|
||||
|
||||
const dto = EntityMappers.toDriverDTO(driver);
|
||||
if (!dto) continue;
|
||||
|
||||
const stats = getDriverStats(membership.driverId);
|
||||
|
||||
members.push({
|
||||
driver: dto,
|
||||
role: membership.role,
|
||||
joinedAt: membership.joinedAt.toISOString(),
|
||||
rating: stats?.rating ?? null,
|
||||
overallRank: typeof stats?.overallRank === 'number' ? stats.overallRank : null,
|
||||
});
|
||||
}
|
||||
const response = await apiClient.teams.getMembers(teamId);
|
||||
|
||||
const members: TeamRosterMemberViewModel[] = response.members.map((member) => ({
|
||||
driver: {
|
||||
id: member.driverId,
|
||||
name: member.driver?.name ?? 'Unknown',
|
||||
avatarUrl: member.driver?.avatarUrl,
|
||||
},
|
||||
role: (member.role as TeamRole) ?? 'member',
|
||||
joinedAt: member.joinedAt,
|
||||
rating: null, // Would need from API
|
||||
overallRank: null, // Would need from API
|
||||
}));
|
||||
|
||||
const averageRating =
|
||||
members.length > 0
|
||||
|
||||
Reference in New Issue
Block a user