wip
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import type { IStandingRepository } from '../../domain/repositories/IStandingRepository';
|
||||
import type { IResultRepository } from '../../domain/repositories/IResultRepository';
|
||||
import type { IPenaltyRepository } from '../../domain/repositories/IPenaltyRepository';
|
||||
import type { IRaceRepository } from '../../domain/repositories/IRaceRepository';
|
||||
import type { LeagueDriverSeasonStatsDTO } from '../dto/LeagueDriverSeasonStatsDTO';
|
||||
|
||||
export interface DriverRatingPort {
|
||||
@@ -16,26 +17,39 @@ export class GetLeagueDriverSeasonStatsQuery {
|
||||
private readonly standingRepository: IStandingRepository,
|
||||
private readonly resultRepository: IResultRepository,
|
||||
private readonly penaltyRepository: IPenaltyRepository,
|
||||
private readonly raceRepository: IRaceRepository,
|
||||
private readonly driverRatingPort: DriverRatingPort,
|
||||
) {}
|
||||
|
||||
async execute(params: GetLeagueDriverSeasonStatsQueryParamsDTO): Promise<LeagueDriverSeasonStatsDTO[]> {
|
||||
const { leagueId } = params;
|
||||
|
||||
const [standings, penaltiesForLeague] = await Promise.all([
|
||||
// Get standings and races for the league
|
||||
const [standings, races] = await Promise.all([
|
||||
this.standingRepository.findByLeagueId(leagueId),
|
||||
this.penaltyRepository.findByLeagueId(leagueId),
|
||||
this.raceRepository.findByLeagueId(leagueId),
|
||||
]);
|
||||
|
||||
// Fetch all penalties for all races in the league
|
||||
const penaltiesArrays = await Promise.all(
|
||||
races.map(race => this.penaltyRepository.findByRaceId(race.id))
|
||||
);
|
||||
const penaltiesForLeague = penaltiesArrays.flat();
|
||||
|
||||
// Group penalties by driver for quick lookup
|
||||
const penaltiesByDriver = new Map<string, { baseDelta: number; bonusDelta: number }>();
|
||||
for (const p of penaltiesForLeague) {
|
||||
// Only count applied penalties
|
||||
if (p.status !== 'applied') continue;
|
||||
|
||||
const current = penaltiesByDriver.get(p.driverId) ?? { baseDelta: 0, bonusDelta: 0 };
|
||||
if (p.pointsDelta < 0) {
|
||||
current.baseDelta += p.pointsDelta;
|
||||
} else {
|
||||
current.bonusDelta += p.pointsDelta;
|
||||
|
||||
// Convert penalty to points delta based on type
|
||||
if (p.type === 'points_deduction' && p.value) {
|
||||
// Points deductions are negative
|
||||
current.baseDelta -= p.value;
|
||||
}
|
||||
|
||||
penaltiesByDriver.set(p.driverId, current);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user