import type { IDriverRepository } from '../../domain/repositories/IDriverRepository'; import type { IRankingService } from '../../domain/services/IRankingService'; import type { IDriverStatsService } from '../../domain/services/IDriverStatsService'; import type { IImageServicePort } from '../ports/IImageServicePort'; import type { IDriversLeaderboardPresenter } from '../presenters/IDriversLeaderboardPresenter'; import type { AsyncUseCase } from '@gridpilot/shared/application'; /** * Use Case for retrieving driver leaderboard data. * Orchestrates domain logic and delegates presentation to the presenter. */ export class GetDriversLeaderboardUseCase implements AsyncUseCase { constructor( private readonly driverRepository: IDriverRepository, private readonly rankingService: IRankingService, private readonly driverStatsService: IDriverStatsService, private readonly imageService: IImageServicePort, public readonly presenter: IDriversLeaderboardPresenter, ) {} async execute(): Promise { const drivers = await this.driverRepository.findAll(); const rankings = this.rankingService.getAllDriverRankings(); const stats: Record = {}; const avatarUrls: Record = {}; for (const driver of drivers) { const driverStats = this.driverStatsService.getDriverStats(driver.id); if (driverStats) { stats[driver.id] = driverStats; } avatarUrls[driver.id] = this.imageService.getDriverAvatar(driver.id); } this.presenter.present(drivers, rankings, stats, avatarUrls); } }