seed data
This commit is contained in:
134
adapters/bootstrap/SeedRacingData.ts
Normal file
134
adapters/bootstrap/SeedRacingData.ts
Normal file
@@ -0,0 +1,134 @@
|
||||
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 RacingSeedDependencies = {
|
||||
driverRepository: IDriverRepository;
|
||||
leagueRepository: ILeagueRepository;
|
||||
raceRepository: IRaceRepository;
|
||||
resultRepository: IResultRepository;
|
||||
standingRepository: IStandingRepository;
|
||||
leagueMembershipRepository: ILeagueMembershipRepository;
|
||||
raceRegistrationRepository: IRaceRegistrationRepository;
|
||||
teamRepository: ITeamRepository;
|
||||
teamMembershipRepository: ITeamMembershipRepository;
|
||||
feedRepository: IFeedRepository;
|
||||
socialGraphRepository: ISocialGraphRepository;
|
||||
};
|
||||
|
||||
export class SeedRacingData {
|
||||
constructor(
|
||||
private readonly logger: Logger,
|
||||
private readonly seedDeps: RacingSeedDependencies,
|
||||
) {}
|
||||
|
||||
async execute(): Promise<void> {
|
||||
const existingDrivers = await this.seedDeps.driverRepository.findAll();
|
||||
if (existingDrivers.length > 0) {
|
||||
this.logger.info('[Bootstrap] 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 racing data: drivers=${seed.drivers.length}, leagues=${seed.leagues.length}, races=${seed.races.length}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user