fix issues in adapters

This commit is contained in:
2025-12-22 22:46:15 +01:00
parent 41b27402dc
commit 1efd971032
25 changed files with 144 additions and 103 deletions

View File

@@ -46,11 +46,9 @@ export class InMemoryStandingRepository implements IStandingRepository {
const standings = Array.from(this.standings.values())
.filter(standing => standing.leagueId.toString() === leagueId)
.sort((a, b) => {
// Sort by position (lower is better)
if (a.position.toNumber() !== b.position.toNumber()) {
return a.position.toNumber() - b.position.toNumber();
}
// If positions are equal, sort by points (higher is better)
return b.points.toNumber() - a.points.toNumber();
});
this.logger.info(`Found ${standings.length} standings for league id: ${leagueId}.`);
@@ -73,7 +71,7 @@ export class InMemoryStandingRepository implements IStandingRepository {
}
return standing;
} catch (error) {
this.logger.error(`Error finding standing for driver ${driverId}, league ${leagueId}:`, error);
this.logger.error(`Error finding standing for driver ${driverId}, league ${leagueId}:`, error instanceof Error ? error : new Error(String(error)));
throw error;
}
}
@@ -93,9 +91,9 @@ export class InMemoryStandingRepository implements IStandingRepository {
async save(standing: Standing): Promise<Standing> {
this.logger.debug(`Saving standing for league: ${standing.leagueId}, driver: ${standing.driverId}`);
try {
const key = this.getKey(standing.leagueId, standing.driverId);
const key = this.getKey(standing.leagueId.toString(), standing.driverId.toString());
if (this.standings.has(key)) {
this.logger.debug(`Updating existing standing for league: ${standing.leagueId}, driver: ${standing.driverId}.`);
this.logger.debug(`Updating existing standing for league: ${standing.leagueId}, driver ${standing.driverId}.`);
} else {
this.logger.debug(`Creating new standing for league: ${standing.leagueId}, driver: ${standing.driverId}.`);
}
@@ -103,7 +101,7 @@ export class InMemoryStandingRepository implements IStandingRepository {
this.logger.info(`Standing for league ${standing.leagueId}, driver ${standing.driverId} saved successfully.`);
return standing;
} catch (error) {
this.logger.error(`Error saving standing for league ${standing.leagueId}, driver ${standing.driverId}:`, error);
this.logger.error(`Error saving standing for league ${standing.leagueId}, driver ${standing.driverId}:`, error instanceof Error ? error : new Error(String(error)));
throw error;
}
}
@@ -112,7 +110,7 @@ export class InMemoryStandingRepository implements IStandingRepository {
this.logger.debug(`Saving ${standings.length} standings.`);
try {
standings.forEach(standing => {
const key = this.getKey(standing.leagueId, standing.driverId);
const key = this.getKey(standing.leagueId.toString(), standing.driverId.toString());
this.standings.set(key, standing);
});
this.logger.info(`${standings.length} standings saved successfully.`);
@@ -133,7 +131,7 @@ export class InMemoryStandingRepository implements IStandingRepository {
this.logger.warn(`Standing for league ${leagueId}, driver ${driverId} not found for deletion.`);
}
} catch (error) {
this.logger.error(`Error deleting standing for league ${leagueId}, driver ${driverId}:`, error);
this.logger.error(`Error deleting standing for league ${leagueId}, driver ${driverId}:`, error instanceof Error ? error : new Error(String(error)));
throw error;
}
}
@@ -163,7 +161,7 @@ export class InMemoryStandingRepository implements IStandingRepository {
this.logger.debug(`Standing for league ${leagueId}, driver ${driverId} exists: ${exists}.`);
return exists;
} catch (error) {
this.logger.error(`Error checking existence of standing for league ${leagueId}, driver ${driverId}:`, error);
this.logger.error(`Error checking existence of standing for league ${leagueId}, driver ${driverId}:`, error instanceof Error ? error : new Error(String(error)));
throw error;
}
}
@@ -176,7 +174,6 @@ export class InMemoryStandingRepository implements IStandingRepository {
throw new Error('Cannot recalculate standings: missing required repositories');
}
// Get league to determine points system
const league = await this.leagueRepository.findById(leagueId);
if (!league) {
this.logger.warn(`League with ID ${leagueId} not found during recalculation.`);
@@ -184,7 +181,6 @@ export class InMemoryStandingRepository implements IStandingRepository {
}
this.logger.debug(`League ${leagueId} found for recalculation.`);
// Get points system
const resolvedPointsSystem =
league.settings.customPoints ??
this.pointsSystems[league.settings.pointsSystem] ??
@@ -196,7 +192,6 @@ export class InMemoryStandingRepository implements IStandingRepository {
}
this.logger.debug(`Resolved points system for league ${leagueId}.`);
// Get all completed races for the league
const races = await this.raceRepository.findCompletedByLeagueId(leagueId);
this.logger.debug(`Found ${races.length} completed races for league ${leagueId}.`);
@@ -205,7 +200,6 @@ export class InMemoryStandingRepository implements IStandingRepository {
return [];
}
// Get all results for these races
const allResults = await Promise.all(
races.map(async race => {
this.logger.debug(`Fetching results for race ${race.id}.`);
@@ -217,50 +211,44 @@ export class InMemoryStandingRepository implements IStandingRepository {
const results = allResults.flat();
this.logger.debug(`Collected ${results.length} results from all completed races.`);
// Calculate standings per driver
const standingsMap = new Map<string, Standing>();
results.forEach(result => {
let standing = standingsMap.get(result.driverId);
const driverIdStr = result.driverId.toString();
let standing = standingsMap.get(driverIdStr);
if (!standing) {
standing = Standing.create({
leagueId,
driverId: result.driverId,
driverId: driverIdStr,
});
this.logger.debug(`Created new standing for driver ${result.driverId} in league ${leagueId}.`);
this.logger.debug(`Created new standing for driver ${driverIdStr} in league ${leagueId}.`);
}
// Add points from this result
standing = standing.addRaceResult(result.position, resolvedPointsSystem);
standingsMap.set(result.driverId, standing);
this.logger.debug(`Driver ${result.driverId} in league ${leagueId} accumulated ${standing.points} points.`);
standing = standing.addRaceResult(result.position.toNumber(), resolvedPointsSystem);
standingsMap.set(driverIdStr, standing);
this.logger.debug(`Driver ${driverIdStr} in league ${leagueId} accumulated ${standing.points} points.`);
});
this.logger.debug(`Calculated initial standings for ${standingsMap.size} drivers.`);
// Sort by points and assign positions
const sortedStandings = Array.from(standingsMap.values())
.sort((a, b) => {
if (b.points !== a.points) {
return b.points - a.points;
if (b.points.toNumber() !== a.points.toNumber()) {
return b.points.toNumber() - a.points.toNumber();
}
// Tie-breaker: most wins
if (b.wins !== a.wins) {
return b.wins - a.wins;
}
// Tie-breaker: most races completed
return b.racesCompleted - a.racesCompleted;
});
this.logger.debug(`Sorted standings for ${sortedStandings.length} drivers.`);
// Assign positions
const updatedStandings = sortedStandings.map((standing, index) => {
const newStanding = standing.updatePosition(index + 1);
this.logger.debug(`Assigned position ${newStanding.position} to driver ${newStanding.driverId}.`);
return newStanding;
});
// Save all standings
await this.saveMany(updatedStandings);
this.logger.info(`Successfully recalculated and saved standings for league ${leagueId}.`);