/** * Application Use Case Interface: RankingUseCase * * Use case for computing driver rankings from standings and results. * This is an application layer concern that orchestrates domain data. */ import type { StandingRepository } from '../../domain/repositories/StandingRepository'; import type { DriverRepository } from '../../domain/repositories/DriverRepository'; import type { DriverStatsRepository } from '../../domain/repositories/DriverStatsRepository'; import type { Logger } from '@core/shared/domain/Logger'; export interface DriverRanking { driverId: string; rating: number; wins: number; totalRaces: number; overallRank: number | null; } export class RankingUseCase { constructor( _standingRepository: StandingRepository, _driverRepository: DriverRepository, private readonly _driverStatsRepository: DriverStatsRepository, private readonly _logger: Logger, ) {} async getAllDriverRankings(): Promise { this._logger.debug('Getting all driver rankings'); const allStats = await this._driverStatsRepository.getAllStats(); const rankings: DriverRanking[] = []; allStats.forEach((stats, driverId) => { rankings.push({ driverId, rating: stats.rating, wins: stats.wins, totalRaces: stats.totalRaces, overallRank: stats.overallRank, }); }); return rankings; } clear(): void { this._logger.info('[RankingUseCase] Clearing all rankings'); // No data to clear as this use case generates data on-the-fly } }