This commit is contained in:
2025-12-21 19:53:22 +01:00
parent f2d8a23583
commit 3c64f328e2
105 changed files with 3191 additions and 1706 deletions

View File

@@ -1,18 +1,53 @@
import type { RaceResultsDetailOutputPort } from '@core/racing/application/ports/output/RaceResultsDetailOutputPort';
import type { Result } from '@core/shared/application/Result';
import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode';
import type {
GetRaceResultsDetailResult,
GetRaceResultsDetailErrorCode,
} from '@core/racing/application/use-cases/GetRaceResultsDetailUseCase';
import type { IImageServicePort } from '@core/racing/application/ports/IImageServicePort';
import type { RaceResultsDetailDTO } from '../dtos/RaceResultsDetailDTO';
import type { RaceResultDTO } from '../dtos/RaceResultDTO';
export type GetRaceResultsDetailResponseModel = RaceResultsDetailDTO;
export type GetRaceResultsDetailApplicationError = ApplicationErrorCode<
GetRaceResultsDetailErrorCode,
{ message: string }
>;
export class RaceResultsDetailPresenter {
private result: RaceResultsDetailDTO | null = null;
private model: GetRaceResultsDetailResponseModel | null = null;
constructor(private readonly imageService: IImageServicePort) {}
async present(outputPort: RaceResultsDetailOutputPort): Promise<void> {
const driverMap = new Map(outputPort.drivers.map(driver => [driver.id, driver]));
reset(): void {
this.model = null;
}
async present(
result: Result<GetRaceResultsDetailResult, GetRaceResultsDetailApplicationError>,
): Promise<void> {
if (result.isErr()) {
const error = result.unwrapErr();
if (error.code === 'RACE_NOT_FOUND') {
this.model = {
raceId: '',
track: '',
results: [],
} as RaceResultsDetailDTO;
return;
}
throw new Error(error.details?.message ?? 'Failed to get race results detail');
}
const output = result.unwrap();
const driverMap = new Map(output.drivers.map(driver => [driver.id, driver]));
const results: RaceResultDTO[] = await Promise.all(
outputPort.results.map(async singleResult => {
output.results.map(async singleResult => {
const driver = driverMap.get(singleResult.driverId.toString());
if (!driver) {
throw new Error(`Driver not found for result: ${singleResult.driverId}`);
@@ -35,22 +70,22 @@ export class RaceResultsDetailPresenter {
}),
);
this.result = {
raceId: outputPort.race.id,
track: outputPort.race.track,
this.model = {
raceId: output.race.id,
track: output.race.track,
results,
} as RaceResultsDetailDTO;
}
getViewModel(): RaceResultsDetailDTO | null {
return this.result;
getResponseModel(): GetRaceResultsDetailResponseModel | null {
return this.model;
}
get viewModel(): RaceResultsDetailDTO {
if (!this.result) {
get responseModel(): GetRaceResultsDetailResponseModel {
if (!this.model) {
throw new Error('Presenter not presented');
}
return this.result;
return this.model;
}
}