website refactor

This commit is contained in:
2026-01-16 21:57:44 +01:00
parent 83a9092c50
commit 27f5a52e04
30 changed files with 166 additions and 161 deletions

View File

@@ -4,40 +4,65 @@ import { Result } from '@core/racing/domain/entities/result/Result';
import type { Season } from '@core/racing/domain/entities/season/Season';
import { Standing } from '@core/racing/domain/entities/Standing';
import { Team } from '@core/racing/domain/entities/Team';
import type { TeamStats } from '@core/racing/domain/repositories/TeamStatsRepository';
import type { DriverRepository } from '@core/racing/domain/repositories/DriverRepository';
import type { LeagueRepository } from '@core/racing/domain/repositories/LeagueRepository';
import type { SeasonRepository } from '@core/racing/domain/repositories/SeasonRepository';
import type { LeagueScoringConfigRepository } from '@core/racing/domain/repositories/LeagueScoringConfigRepository';
import type { SeasonSponsorshipRepository } from '@core/racing/domain/repositories/SeasonSponsorshipRepository';
import type { SponsorshipRequestRepository } from '@core/racing/domain/repositories/SponsorshipRequestRepository';
import type { LeagueWalletRepository } from '@core/racing/domain/repositories/LeagueWalletRepository';
import type { TransactionRepository } from '@core/racing/domain/repositories/TransactionRepository';
import type { ProtestRepository } from '@core/racing/domain/repositories/ProtestRepository';
import type { PenaltyRepository } from '@core/racing/domain/repositories/PenaltyRepository';
import type { RaceRepository } from '@core/racing/domain/repositories/RaceRepository';
import type { ResultRepository } from '@core/racing/domain/repositories/ResultRepository';
import type { StandingRepository } from '@core/racing/domain/repositories/StandingRepository';
import type { LeagueMembershipRepository } from '@core/racing/domain/repositories/LeagueMembershipRepository';
import type { RaceRegistrationRepository } from '@core/racing/domain/repositories/RaceRegistrationRepository';
import type { TeamRepository } from '@core/racing/domain/repositories/TeamRepository';
import type { TeamMembershipRepository } from '@core/racing/domain/repositories/TeamMembershipRepository';
import type { SponsorRepository } from '@core/racing/domain/repositories/SponsorRepository';
import type { FeedRepository } from '@core/social/domain/repositories/FeedRepository';
import type { SocialGraphRepository } from '@core/social/domain/repositories/SocialGraphRepository';
import type { DriverStatsRepository } from '@core/racing/domain/repositories/DriverStatsRepository';
import type { TeamStatsRepository, TeamStats } from '@core/racing/domain/repositories/TeamStatsRepository';
import type { MediaRepository } from '@core/racing/domain/repositories/MediaRepository';
import type { AuthRepository } from '@core/identity/domain/repositories/AuthRepository';
import type { PasswordHashingService } from '@core/identity/domain/services/PasswordHashingService';
import type { AdminUserRepository } from '@core/admin/domain/repositories/AdminUserRepository';
import type { Logger } from '@core/shared/domain/Logger';
import { getLeagueScoringPresetById } from './LeagueScoringPresets';
import { createRacingSeed } from './racing/RacingSeed';
import { seedId } from './racing/SeedIdHelper';
export type RacingSeedDependencies = {
driverRepository: IDriverRepository;
leagueRepository: ILeagueRepository;
seasonRepository: ISeasonRepository;
leagueScoringConfigRepository: ILeagueScoringConfigRepository;
seasonSponsorshipRepository: ISeasonSponsorshipRepository;
sponsorshipRequestRepository: ISponsorshipRequestRepository;
leagueWalletRepository: ILeagueWalletRepository;
transactionRepository: ITransactionRepository;
protestRepository: IProtestRepository;
penaltyRepository: IPenaltyRepository;
raceRepository: IRaceRepository;
resultRepository: IResultRepository;
standingRepository: IStandingRepository;
leagueMembershipRepository: ILeagueMembershipRepository;
raceRegistrationRepository: IRaceRegistrationRepository;
teamRepository: ITeamRepository;
teamMembershipRepository: ITeamMembershipRepository;
sponsorRepository: ISponsorRepository;
feedRepository: IFeedRepository;
socialGraphRepository: ISocialGraphRepository;
driverStatsRepository: IDriverStatsRepository;
teamStatsRepository: ITeamStatsRepository;
mediaRepository: IMediaRepository;
driverRepository: DriverRepository;
leagueRepository: LeagueRepository;
seasonRepository: SeasonRepository;
leagueScoringConfigRepository: LeagueScoringConfigRepository;
seasonSponsorshipRepository: SeasonSponsorshipRepository;
sponsorshipRequestRepository: SponsorshipRequestRepository;
leagueWalletRepository: LeagueWalletRepository;
transactionRepository: TransactionRepository;
protestRepository: ProtestRepository;
penaltyRepository: PenaltyRepository;
raceRepository: RaceRepository;
resultRepository: ResultRepository;
standingRepository: StandingRepository;
leagueMembershipRepository: LeagueMembershipRepository;
raceRegistrationRepository: RaceRegistrationRepository;
teamRepository: TeamRepository;
teamMembershipRepository: TeamMembershipRepository;
sponsorRepository: SponsorRepository;
feedRepository: FeedRepository;
socialGraphRepository: SocialGraphRepository;
driverStatsRepository: DriverStatsRepository;
teamStatsRepository: TeamStatsRepository;
mediaRepository: MediaRepository;
// Identity dependencies for demo user seed
authRepository: IAuthRepository;
passwordHashingService: IPasswordHashingService;
adminUserRepository: IAdminUserRepository;
authRepository: AuthRepository;
passwordHashingService: PasswordHashingService;
adminUserRepository: AdminUserRepository;
};
export class SeedRacingData {
@@ -280,7 +305,7 @@ export class SeedRacingData {
// ignore duplicates
}
const seedableFeed = this.seedDeps.feedRepository as unknown as { seed?: (input: unknown) => void };
const seedableFeed = this.seedDeps.feedRepository as unknown as { seed?: (input: any) => void };
if (typeof seedableFeed.seed === 'function') {
seedableFeed.seed({
drivers: seed.drivers,
@@ -289,7 +314,7 @@ export class SeedRacingData {
});
}
const seedableSocial = this.seedDeps.socialGraphRepository as unknown as { seed?: (input: unknown) => void };
const seedableSocial = this.seedDeps.socialGraphRepository as unknown as { seed?: (input: any) => void };
if (typeof seedableSocial.seed === 'function') {
seedableSocial.seed({
drivers: seed.drivers,
@@ -317,8 +342,8 @@ export class SeedRacingData {
this.logger.info(`[Bootstrap] Computing stats for ${drivers.length} drivers from ${standings.length} standings and ${results.length} results`);
for (const driver of drivers) {
const driverResults = results.filter(r => r.driverId.toString() === driver.id);
const driverStandings = standings.filter(s => s.driverId.toString() === driver.id);
const driverResults = results.filter((r: Result) => r.driverId.toString() === driver.id);
const driverStandings = standings.filter((s: Standing) => s.driverId.toString() === driver.id);
if (driverResults.length === 0) continue;
@@ -398,13 +423,13 @@ export class SeedRacingData {
for (const team of teams) {
// Get team members using the correct method
const teamMemberships = await this.seedDeps.teamMembershipRepository.getTeamMembers(team.id);
const teamMemberIds = teamMemberships.map(m => m.driverId.toString());
const teamMemberIds = teamMemberships.map((m: any) => m.driverId.toString());
// Get results for team members
const teamResults = results.filter(r => teamMemberIds.includes(r.driverId.toString()));
const teamResults = results.filter((r: Result) => teamMemberIds.includes(r.driverId.toString()));
// Get team drivers for name resolution
const teamDrivers = drivers.filter(d => teamMemberIds.includes(d.id));
const teamDrivers = drivers.filter((d: Driver) => teamMemberIds.includes(d.id));
const stats = this.calculateTeamStats(team, teamResults, teamDrivers);
await this.seedDeps.teamStatsRepository.saveTeamStats(team.id, stats);