This commit is contained in:
2025-12-16 21:05:01 +01:00
parent f61e3a4e5a
commit 7532c7ed6d
207 changed files with 7861 additions and 2606 deletions

View File

@@ -7,14 +7,15 @@ import type { ILeagueMembershipRepository } from '../../domain/repositories/ILea
import type { DriverRatingProvider } from '../ports/DriverRatingProvider';
import type { IImageServicePort } from '../ports/IImageServicePort';
import type {
IRaceDetailPresenter,
RaceDetailViewModel,
RaceDetailRaceViewModel,
RaceDetailLeagueViewModel,
RaceDetailEntryViewModel,
RaceDetailUserResultViewModel,
} from '../presenters/IRaceDetailPresenter';
import type { UseCase } from '@core/shared/application/UseCase';
import type { AsyncUseCase } from '@core/shared/application/AsyncUseCase';
import { Result } from '@core/shared/application/Result';
import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode';
/**
* Use Case: GetRaceDetailUseCase
@@ -31,8 +32,10 @@ export interface GetRaceDetailQueryParams {
driverId: string;
}
type GetRaceDetailErrorCode = 'RACE_NOT_FOUND';
export class GetRaceDetailUseCase
implements UseCase<GetRaceDetailQueryParams, RaceDetailViewModel, RaceDetailViewModel, IRaceDetailPresenter>
implements AsyncUseCase<GetRaceDetailQueryParams, RaceDetailViewModel, GetRaceDetailErrorCode>
{
constructor(
private readonly raceRepository: IRaceRepository,
@@ -45,26 +48,12 @@ export class GetRaceDetailUseCase
private readonly imageService: IImageServicePort,
) {}
async execute(params: GetRaceDetailQueryParams, presenter: IRaceDetailPresenter): Promise<void> {
presenter.reset();
async execute(params: GetRaceDetailQueryParams): Promise<Result<RaceDetailViewModel, ApplicationErrorCode<GetRaceDetailErrorCode>>> {
const { raceId, driverId } = params;
const race = await this.raceRepository.findById(raceId);
if (!race) {
const emptyViewModel: RaceDetailViewModel = {
race: null,
league: null,
entryList: [],
registration: {
isUserRegistered: false,
canRegister: false,
},
userResult: null,
error: 'Race not found',
};
presenter.present(emptyViewModel);
return;
return Result.err({ code: 'RACE_NOT_FOUND' });
}
const [league, registeredDriverIds, membership] = await Promise.all([
@@ -156,7 +145,7 @@ export class GetRaceDetailUseCase
userResult: userResultView,
};
presenter.present(viewModel);
return Result.ok(viewModel);
}
private calculateRatingChange(position: number): number {