refactor
This commit is contained in:
@@ -1,8 +1,59 @@
|
||||
import type {
|
||||
IDriverTeamPresenter,
|
||||
DriverTeamViewModel,
|
||||
DriverTeamResultDTO,
|
||||
} from '@gridpilot/racing/application/presenters/IDriverTeamPresenter';
|
||||
/**
|
||||
* DriverTeamPresenter - Pure data transformer
|
||||
* Transforms API response to view model without DI dependencies.
|
||||
*/
|
||||
|
||||
import { apiClient, type DriverTeamViewModel as ApiDriverTeamViewModel } from '@/lib/apiClient';
|
||||
|
||||
export interface DriverTeamMembershipViewModel {
|
||||
role: string;
|
||||
joinedAt: string;
|
||||
isActive: boolean;
|
||||
}
|
||||
|
||||
export interface DriverTeamInfoViewModel {
|
||||
id: string;
|
||||
name: string;
|
||||
tag?: string | undefined;
|
||||
description?: string | undefined;
|
||||
ownerId: string;
|
||||
leagues?: string[] | undefined;
|
||||
}
|
||||
|
||||
export interface DriverTeamViewModel {
|
||||
team: DriverTeamInfoViewModel;
|
||||
membership: DriverTeamMembershipViewModel;
|
||||
isOwner: boolean;
|
||||
canManage: boolean;
|
||||
}
|
||||
|
||||
export interface IDriverTeamPresenter {
|
||||
reset(): void;
|
||||
getViewModel(): DriverTeamViewModel | null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform API response to view model
|
||||
*/
|
||||
function transformApiResponse(apiResponse: ApiDriverTeamViewModel): DriverTeamViewModel {
|
||||
const isOwner = false; // Would need team owner info from API
|
||||
const canManage = apiResponse.role === 'owner' || apiResponse.role === 'manager';
|
||||
|
||||
return {
|
||||
team: {
|
||||
id: apiResponse.teamId,
|
||||
name: apiResponse.teamName,
|
||||
ownerId: '', // Would need from API
|
||||
},
|
||||
membership: {
|
||||
role: apiResponse.role === 'driver' ? 'member' : apiResponse.role,
|
||||
joinedAt: new Date(apiResponse.joinedAt).toISOString(),
|
||||
isActive: true,
|
||||
},
|
||||
isOwner,
|
||||
canManage,
|
||||
};
|
||||
}
|
||||
|
||||
export class DriverTeamPresenter implements IDriverTeamPresenter {
|
||||
private viewModel: DriverTeamViewModel | null = null;
|
||||
@@ -11,32 +62,27 @@ export class DriverTeamPresenter implements IDriverTeamPresenter {
|
||||
this.viewModel = null;
|
||||
}
|
||||
|
||||
present(input: DriverTeamResultDTO): void {
|
||||
const { team, membership, driverId } = input;
|
||||
|
||||
const isOwner = team.ownerId === driverId;
|
||||
const canManage = membership.role === 'owner' || membership.role === 'manager';
|
||||
|
||||
this.viewModel = {
|
||||
team: {
|
||||
id: team.id,
|
||||
name: team.name,
|
||||
tag: team.tag,
|
||||
description: team.description,
|
||||
ownerId: team.ownerId,
|
||||
leagues: team.leagues,
|
||||
},
|
||||
membership: {
|
||||
role: membership.role === 'driver' ? 'member' : membership.role,
|
||||
joinedAt: membership.joinedAt.toISOString(),
|
||||
isActive: membership.status === 'active',
|
||||
},
|
||||
isOwner,
|
||||
canManage,
|
||||
};
|
||||
async fetchAndPresent(driverId: string): Promise<void> {
|
||||
const apiResponse = await apiClient.teams.getDriverTeam(driverId);
|
||||
if (apiResponse) {
|
||||
this.viewModel = transformApiResponse(apiResponse);
|
||||
} else {
|
||||
this.viewModel = null;
|
||||
}
|
||||
}
|
||||
|
||||
getViewModel(): DriverTeamViewModel | null {
|
||||
return this.viewModel;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience function to fetch and transform driver's team
|
||||
*/
|
||||
export async function fetchDriverTeam(driverId: string): Promise<DriverTeamViewModel | null> {
|
||||
const apiResponse = await apiClient.teams.getDriverTeam(driverId);
|
||||
if (!apiResponse) {
|
||||
return null;
|
||||
}
|
||||
return transformApiResponse(apiResponse);
|
||||
}
|
||||
Reference in New Issue
Block a user