import type { IRaceRepository } from '../../domain/repositories/IRaceRepository'; import type { ILeagueRepository } from '../../domain/repositories/ILeagueRepository'; import type { IResultRepository } from '../../domain/repositories/IResultRepository'; import type { IStandingRepository } from '../../domain/repositories/IStandingRepository'; import { Result } from '../../domain/entities/Result'; import type { IImportRaceResultsPresenter, ImportRaceResultsSummaryViewModel, } from '../presenters/IImportRaceResultsPresenter'; export interface ImportRaceResultDTO { id: string; raceId: string; driverId: string; position: number; fastestLap: number; incidents: number; startPosition: number; } export interface ImportRaceResultsParams { raceId: string; results: ImportRaceResultDTO[]; } export class ImportRaceResultsUseCase { constructor( private readonly raceRepository: IRaceRepository, private readonly leagueRepository: ILeagueRepository, private readonly resultRepository: IResultRepository, private readonly standingRepository: IStandingRepository, public readonly presenter: IImportRaceResultsPresenter, ) {} async execute(params: ImportRaceResultsParams): Promise { const { raceId, results } = params; const race = await this.raceRepository.findById(raceId); if (!race) { throw new Error('Race not found'); } const league = await this.leagueRepository.findById(race.leagueId); if (!league) { throw new Error('League not found'); } const existing = await this.resultRepository.existsByRaceId(raceId); if (existing) { throw new Error('Results already exist for this race'); } const entities = results.map((dto) => Result.create({ id: dto.id, raceId: dto.raceId, driverId: dto.driverId, position: dto.position, fastestLap: dto.fastestLap, incidents: dto.incidents, startPosition: dto.startPosition, }), ); await this.resultRepository.createMany(entities); await this.standingRepository.recalculate(league.id); const viewModel: ImportRaceResultsSummaryViewModel = { importedCount: results.length, standingsRecalculated: true, }; this.presenter.present(viewModel); } }