This commit is contained in:
2025-12-12 01:11:36 +01:00
parent ec3ddc3a5c
commit 6a88fe93ab
125 changed files with 1513 additions and 803 deletions

View File

@@ -8,6 +8,7 @@ import type {
RaceResultsDetailViewModel,
RaceResultsPenaltySummaryViewModel,
} from '../presenters/IRaceResultsDetailPresenter';
import type { UseCase } from '@gridpilot/shared/application/UseCase';
import type { League } from '../../domain/entities/League';
import type { Result } from '../../domain/entities/Result';
import type { Driver } from '../../domain/entities/Driver';
@@ -18,8 +19,8 @@ export interface GetRaceResultsDetailParams {
driverId?: string;
}
function buildPointsSystem(league: League | null): Record<number, number> {
if (!league) return {};
function buildPointsSystem(league: League | null): Record<number, number> | undefined {
if (!league) return undefined;
const pointsSystems: Record<string, Record<number, number>> = {
'f1-2024': {
@@ -53,11 +54,17 @@ function buildPointsSystem(league: League | null): Record<number, number> {
},
};
return (
league.settings.customPoints ||
pointsSystems[league.settings.pointsSystem] ||
pointsSystems['f1-2024']
);
const customPoints = league.settings.customPoints;
if (customPoints) {
return customPoints;
}
const preset = pointsSystems[league.settings.pointsSystem];
if (preset) {
return preset;
}
return pointsSystems['f1-2024'];
}
function getFastestLapTime(results: Result[]): number | undefined {
@@ -73,17 +80,28 @@ function mapPenaltySummary(penalties: Penalty[]): RaceResultsPenaltySummaryViewM
}));
}
export class GetRaceResultsDetailUseCase {
export class GetRaceResultsDetailUseCase
implements
UseCase<
GetRaceResultsDetailParams,
RaceResultsDetailViewModel,
RaceResultsDetailViewModel,
IRaceResultsDetailPresenter
>
{
constructor(
private readonly raceRepository: IRaceRepository,
private readonly leagueRepository: ILeagueRepository,
private readonly resultRepository: IResultRepository,
private readonly driverRepository: IDriverRepository,
private readonly penaltyRepository: IPenaltyRepository,
public readonly presenter: IRaceResultsDetailPresenter,
) {}
async execute(params: GetRaceResultsDetailParams): Promise<void> {
async execute(
params: GetRaceResultsDetailParams,
presenter: IRaceResultsDetailPresenter,
): Promise<void> {
presenter.reset();
const { raceId, driverId } = params;
const race = await this.raceRepository.findById(raceId);
@@ -95,11 +113,10 @@ export class GetRaceResultsDetailUseCase {
results: [],
drivers: [],
penalties: [],
pointsSystem: {},
currentDriverId: driverId,
...(driverId ? { currentDriverId: driverId } : {}),
error: 'Race not found',
};
this.presenter.present(errorViewModel);
presenter.present(errorViewModel);
return;
}
@@ -111,12 +128,12 @@ export class GetRaceResultsDetailUseCase {
]);
const effectiveCurrentDriverId =
driverId || (drivers.length > 0 ? drivers[0]!.id : undefined);
driverId ?? (drivers.length > 0 ? drivers[0]!.id : undefined);
const pointsSystem = buildPointsSystem(league as League | null);
const fastestLapTime = getFastestLapTime(results);
const penaltySummary = mapPenaltySummary(penalties);
const viewModel: RaceResultsDetailViewModel = {
race: {
id: race.id,
@@ -134,11 +151,11 @@ export class GetRaceResultsDetailUseCase {
results,
drivers,
penalties: penaltySummary,
pointsSystem,
...(pointsSystem ? { pointsSystem } : {}),
...(fastestLapTime !== undefined ? { fastestLapTime } : {}),
currentDriverId: effectiveCurrentDriverId,
...(effectiveCurrentDriverId ? { currentDriverId: effectiveCurrentDriverId } : {}),
};
this.presenter.present(viewModel);
presenter.present(viewModel);
}
}