fix data flow issues
This commit is contained in:
@@ -43,7 +43,16 @@ export class RaceService {
|
||||
*/
|
||||
async getRacesPageData(): Promise<RacesPageViewModel> {
|
||||
const dto = await this.apiClient.getPageData();
|
||||
return new RacesPageViewModel(this.transformRacesPageData(dto));
|
||||
return new RacesPageViewModel(dto);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all races page data with view model transformation
|
||||
* Currently same as getRacesPageData, but can be extended for different filtering
|
||||
*/
|
||||
async getAllRacesPageData(): Promise<RacesPageViewModel> {
|
||||
const dto = await this.apiClient.getPageData();
|
||||
return new RacesPageViewModel(dto);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -82,38 +91,6 @@ export class RaceService {
|
||||
await this.apiClient.complete(raceId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform API races page data to view model format
|
||||
*/
|
||||
private transformRacesPageData(dto: RacesPageDataDto): {
|
||||
upcomingRaces: Array<{ id: string; title: string; scheduledTime: string; status: string }>;
|
||||
completedRaces: Array<{ id: string; title: string; scheduledTime: string; status: string }>;
|
||||
totalCount: number;
|
||||
} {
|
||||
const upcomingRaces = dto.races
|
||||
.filter(race => race.status !== 'completed')
|
||||
.map(race => ({
|
||||
id: race.id,
|
||||
title: `${race.track} - ${race.car}`,
|
||||
scheduledTime: race.scheduledAt,
|
||||
status: race.status,
|
||||
}));
|
||||
|
||||
const completedRaces = dto.races
|
||||
.filter(race => race.status === 'completed')
|
||||
.map(race => ({
|
||||
id: race.id,
|
||||
title: `${race.track} - ${race.car}`,
|
||||
scheduledTime: race.scheduledAt,
|
||||
status: race.status,
|
||||
}));
|
||||
|
||||
return {
|
||||
upcomingRaces,
|
||||
completedRaces,
|
||||
totalCount: dto.races.length,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Find races by league ID
|
||||
|
||||
36
apps/website/lib/services/races/RaceStewardingService.ts
Normal file
36
apps/website/lib/services/races/RaceStewardingService.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import { RacesApiClient } from '../../api/races/RacesApiClient';
|
||||
import { ProtestsApiClient } from '../../api/protests/ProtestsApiClient';
|
||||
import { PenaltiesApiClient } from '../../api/penalties/PenaltiesApiClient';
|
||||
import { RaceStewardingViewModel } from '../../view-models/RaceStewardingViewModel';
|
||||
|
||||
/**
|
||||
* Race Stewarding Service
|
||||
*
|
||||
* Orchestrates race stewarding operations by coordinating API calls for race details,
|
||||
* protests, and penalties, and returning a unified view model.
|
||||
*/
|
||||
export class RaceStewardingService {
|
||||
constructor(
|
||||
private readonly racesApiClient: RacesApiClient,
|
||||
private readonly protestsApiClient: ProtestsApiClient,
|
||||
private readonly penaltiesApiClient: PenaltiesApiClient
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Get race stewarding data with view model transformation
|
||||
*/
|
||||
async getRaceStewardingData(raceId: string, driverId: string): Promise<RaceStewardingViewModel> {
|
||||
// Fetch all data in parallel
|
||||
const [raceDetail, protests, penalties] = await Promise.all([
|
||||
this.racesApiClient.getDetail(raceId, driverId),
|
||||
this.protestsApiClient.getRaceProtests(raceId),
|
||||
this.penaltiesApiClient.getRacePenalties(raceId),
|
||||
]);
|
||||
|
||||
return new RaceStewardingViewModel({
|
||||
raceDetail,
|
||||
protests,
|
||||
penalties,
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user