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

@@ -14,6 +14,7 @@ import type {
RaceDetailEntryViewModel,
RaceDetailUserResultViewModel,
} from '../presenters/IRaceDetailPresenter';
import type { UseCase } from '@gridpilot/shared/application/UseCase';
/**
* Use Case: GetRaceDetailUseCase
@@ -30,7 +31,9 @@ export interface GetRaceDetailQueryParams {
driverId: string;
}
export class GetRaceDetailUseCase {
export class GetRaceDetailUseCase
implements UseCase<GetRaceDetailQueryParams, RaceDetailViewModel, RaceDetailViewModel, IRaceDetailPresenter>
{
constructor(
private readonly raceRepository: IRaceRepository,
private readonly leagueRepository: ILeagueRepository,
@@ -40,10 +43,11 @@ export class GetRaceDetailUseCase {
private readonly leagueMembershipRepository: ILeagueMembershipRepository,
private readonly driverRatingProvider: DriverRatingProvider,
private readonly imageService: IImageServicePort,
public readonly presenter: IRaceDetailPresenter,
) {}
async execute(params: GetRaceDetailQueryParams): Promise<void> {
async execute(params: GetRaceDetailQueryParams, presenter: IRaceDetailPresenter): Promise<void> {
presenter.reset();
const { raceId, driverId } = params;
const race = await this.raceRepository.findById(raceId);
@@ -59,7 +63,7 @@ export class GetRaceDetailUseCase {
userResult: null,
error: 'Race not found',
};
this.presenter.present(emptyViewModel);
presenter.present(emptyViewModel);
return;
}
@@ -121,8 +125,8 @@ export class GetRaceDetailUseCase {
sessionType: race.sessionType,
status: race.status,
strengthOfField: race.strengthOfField ?? null,
registeredCount: race.registeredCount,
maxParticipants: race.maxParticipants,
...(race.registeredCount !== undefined ? { registeredCount: race.registeredCount } : {}),
...(race.maxParticipants !== undefined ? { maxParticipants: race.maxParticipants } : {}),
};
const leagueView: RaceDetailLeagueViewModel | null = league
@@ -131,8 +135,12 @@ export class GetRaceDetailUseCase {
name: league.name,
description: league.description,
settings: {
maxDrivers: league.settings.maxDrivers,
qualifyingFormat: league.settings.qualifyingFormat,
...(league.settings.maxDrivers !== undefined
? { maxDrivers: league.settings.maxDrivers }
: {}),
...(league.settings.qualifyingFormat !== undefined
? { qualifyingFormat: league.settings.qualifyingFormat }
: {}),
},
}
: null;
@@ -148,7 +156,7 @@ export class GetRaceDetailUseCase {
userResult: userResultView,
};
this.presenter.present(viewModel);
presenter.present(viewModel);
}
private calculateRatingChange(position: number): number {