import type { Logger } from '@core/shared/application'; import type { IDriverRepository } from '@core/racing/domain/repositories/IDriverRepository'; import type { ILeagueRepository } from '@core/racing/domain/repositories/ILeagueRepository'; import type { IRaceRepository } from '@core/racing/domain/repositories/IRaceRepository'; import type { IResultRepository } from '@core/racing/domain/repositories/IResultRepository'; import type { IStandingRepository } from '@core/racing/domain/repositories/IStandingRepository'; import type { ILeagueMembershipRepository } from '@core/racing/domain/repositories/ILeagueMembershipRepository'; import type { IRaceRegistrationRepository } from '@core/racing/domain/repositories/IRaceRegistrationRepository'; import type { ITeamRepository } from '@core/racing/domain/repositories/ITeamRepository'; import type { ITeamMembershipRepository } from '@core/racing/domain/repositories/ITeamMembershipRepository'; import type { IFeedRepository } from '@core/social/domain/repositories/IFeedRepository'; import type { ISocialGraphRepository } from '@core/social/domain/repositories/ISocialGraphRepository'; import { createRacingSeed } from './racing/RacingSeed'; export type InMemorySeedDependencies = { driverRepository: IDriverRepository; leagueRepository: ILeagueRepository; raceRepository: IRaceRepository; resultRepository: IResultRepository; standingRepository: IStandingRepository; leagueMembershipRepository: ILeagueMembershipRepository; raceRegistrationRepository: IRaceRegistrationRepository; teamRepository: ITeamRepository; teamMembershipRepository: ITeamMembershipRepository; feedRepository: IFeedRepository; socialGraphRepository: ISocialGraphRepository; }; export class SeedInMemoryRacingData { constructor( private readonly logger: Logger, private readonly seedDeps: InMemorySeedDependencies, ) {} async execute(): Promise { const existingDrivers = await this.seedDeps.driverRepository.findAll(); if (existingDrivers.length > 0) { this.logger.info('[Bootstrap] In-memory racing seed skipped (drivers already exist)'); return; } const seed = createRacingSeed(); for (const driver of seed.drivers) { try { await this.seedDeps.driverRepository.create(driver); } catch { // ignore duplicates } } for (const league of seed.leagues) { try { await this.seedDeps.leagueRepository.create(league); } catch { // ignore duplicates } } for (const race of seed.races) { try { await this.seedDeps.raceRepository.create(race); } catch { // ignore duplicates } } try { await this.seedDeps.resultRepository.createMany(seed.results); } catch { // ignore duplicates } for (const membership of seed.leagueMemberships) { try { await this.seedDeps.leagueMembershipRepository.saveMembership(membership); } catch { // ignore duplicates } } for (const team of seed.teams) { try { await this.seedDeps.teamRepository.create(team); } catch { // ignore duplicates } } for (const membership of seed.teamMemberships) { try { await this.seedDeps.teamMembershipRepository.saveMembership(membership); } catch { // ignore duplicates } } for (const registration of seed.raceRegistrations) { try { await this.seedDeps.raceRegistrationRepository.register(registration); } catch { // ignore duplicates } } try { await this.seedDeps.standingRepository.saveMany(seed.standings); } catch { // ignore duplicates } const seedableFeed = this.seedDeps.feedRepository as unknown as { seed?: (input: unknown) => void }; if (typeof seedableFeed.seed === 'function') { seedableFeed.seed({ drivers: seed.drivers, friendships: seed.friendships, feedEvents: seed.feedEvents, }); } const seedableSocial = this.seedDeps.socialGraphRepository as unknown as { seed?: (input: unknown) => void }; if (typeof seedableSocial.seed === 'function') { seedableSocial.seed({ drivers: seed.drivers, friendships: seed.friendships, feedEvents: seed.feedEvents, }); } this.logger.info( `[Bootstrap] Seeded in-memory racing data: drivers=${seed.drivers.length}, leagues=${seed.leagues.length}, races=${seed.races.length}`, ); } }