refactor
This commit is contained in:
@@ -1,20 +1,23 @@
|
||||
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
|
||||
import { EntityMappers } from '@gridpilot/racing/application/mappers/EntityMappers';
|
||||
import {
|
||||
getDriverRepository,
|
||||
getGetTeamJoinRequestsUseCase,
|
||||
getApproveTeamJoinRequestUseCase,
|
||||
getRejectTeamJoinRequestUseCase,
|
||||
getUpdateTeamUseCase,
|
||||
} from '@/lib/di-container';
|
||||
/**
|
||||
* TeamAdminPresenter - Pure data transformer
|
||||
* Transforms API responses to view models without DI dependencies.
|
||||
* All data fetching is done via apiClient.
|
||||
*/
|
||||
|
||||
import { apiClient } from '@/lib/apiClient';
|
||||
import type { DriverDTO } from '@/lib/apiClient';
|
||||
|
||||
// ============================================================================
|
||||
// View Model Types
|
||||
// ============================================================================
|
||||
|
||||
export interface TeamAdminJoinRequestViewModel {
|
||||
id: string;
|
||||
teamId: string;
|
||||
driverId: string;
|
||||
requestedAt: Date;
|
||||
message?: string;
|
||||
driver?: DriverDTO;
|
||||
message?: string | undefined;
|
||||
driver?: DriverDTO | undefined;
|
||||
}
|
||||
|
||||
export interface TeamAdminTeamSummaryViewModel {
|
||||
@@ -30,11 +33,15 @@ export interface TeamAdminViewModel {
|
||||
requests: TeamAdminJoinRequestViewModel[];
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Data Fetching Functions (using apiClient)
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* Load join requests plus driver DTOs for a team.
|
||||
* Load team admin view model via API.
|
||||
*/
|
||||
export async function loadTeamAdminViewModel(
|
||||
team: TeamAdminTeamSummaryViewModel,
|
||||
team: TeamAdminTeamSummaryViewModel
|
||||
): Promise<TeamAdminViewModel> {
|
||||
const requests = await loadTeamJoinRequests(team.id);
|
||||
return {
|
||||
@@ -49,52 +56,27 @@ export async function loadTeamAdminViewModel(
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Load join requests for a team via API.
|
||||
*/
|
||||
export async function loadTeamJoinRequests(
|
||||
teamId: string,
|
||||
teamId: string
|
||||
): Promise<TeamAdminJoinRequestViewModel[]> {
|
||||
const getRequestsUseCase = getGetTeamJoinRequestsUseCase();
|
||||
const presenter = new (await import('./TeamJoinRequestsPresenter')).TeamJoinRequestsPresenter();
|
||||
|
||||
await getRequestsUseCase.execute({ teamId }, presenter);
|
||||
|
||||
const presenterVm = presenter.getViewModel();
|
||||
if (!presenterVm) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const driverRepo = getDriverRepository();
|
||||
const allDrivers = await driverRepo.findAll();
|
||||
const driversById: Record<string, DriverDTO> = {};
|
||||
|
||||
for (const driver of allDrivers) {
|
||||
const dto = EntityMappers.toDriverDTO(driver);
|
||||
if (dto) {
|
||||
driversById[dto.id] = dto;
|
||||
}
|
||||
}
|
||||
|
||||
return presenterVm.requests.map((req: {
|
||||
requestId: string;
|
||||
teamId: string;
|
||||
driverId: string;
|
||||
requestedAt: string;
|
||||
message?: string;
|
||||
}): TeamAdminJoinRequestViewModel => {
|
||||
const base: TeamAdminJoinRequestViewModel = {
|
||||
id: req.requestId,
|
||||
const response = await apiClient.teams.getJoinRequests(teamId);
|
||||
|
||||
return response.requests.map((req) => {
|
||||
const viewModel: TeamAdminJoinRequestViewModel = {
|
||||
id: req.id,
|
||||
teamId: req.teamId,
|
||||
driverId: req.driverId,
|
||||
requestedAt: new Date(req.requestedAt),
|
||||
};
|
||||
|
||||
const message = req.message;
|
||||
const driver = driversById[req.driverId];
|
||||
if (req.message) {
|
||||
viewModel.message = req.message;
|
||||
}
|
||||
|
||||
return {
|
||||
...base,
|
||||
...(message !== undefined ? { message } : {}),
|
||||
...(driver !== undefined ? { driver } : {}),
|
||||
};
|
||||
return viewModel;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -103,10 +85,9 @@ export async function loadTeamJoinRequests(
|
||||
*/
|
||||
export async function approveTeamJoinRequestAndReload(
|
||||
requestId: string,
|
||||
teamId: string,
|
||||
teamId: string
|
||||
): Promise<TeamAdminJoinRequestViewModel[]> {
|
||||
const useCase = getApproveTeamJoinRequestUseCase();
|
||||
await useCase.execute({ requestId });
|
||||
await apiClient.teams.approveJoinRequest(teamId, requestId);
|
||||
return loadTeamJoinRequests(teamId);
|
||||
}
|
||||
|
||||
@@ -115,15 +96,14 @@ export async function approveTeamJoinRequestAndReload(
|
||||
*/
|
||||
export async function rejectTeamJoinRequestAndReload(
|
||||
requestId: string,
|
||||
teamId: string,
|
||||
teamId: string
|
||||
): Promise<TeamAdminJoinRequestViewModel[]> {
|
||||
const useCase = getRejectTeamJoinRequestUseCase();
|
||||
await useCase.execute({ requestId });
|
||||
await apiClient.teams.rejectJoinRequest(teamId, requestId);
|
||||
return loadTeamJoinRequests(teamId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update team basic details.
|
||||
* Update team basic details via API.
|
||||
*/
|
||||
export async function updateTeamDetails(params: {
|
||||
teamId: string;
|
||||
@@ -132,14 +112,8 @@ export async function updateTeamDetails(params: {
|
||||
description: string;
|
||||
updatedByDriverId: string;
|
||||
}): Promise<void> {
|
||||
const useCase = getUpdateTeamUseCase();
|
||||
await useCase.execute({
|
||||
teamId: params.teamId,
|
||||
updates: {
|
||||
name: params.name,
|
||||
tag: params.tag,
|
||||
description: params.description,
|
||||
},
|
||||
updatedBy: params.updatedByDriverId,
|
||||
await apiClient.teams.update(params.teamId, {
|
||||
name: params.name,
|
||||
description: params.description,
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user