Files
gridpilot.gg/testing/fixtures/racing/RacingStaticSeed.ts
2025-12-23 17:31:45 +01:00

203 lines
6.2 KiB
TypeScript

import { Driver } from '@core/racing/domain/entities/Driver';
import { League } from '@core/racing/domain/entities/League';
import { Race } from '@core/racing/domain/entities/Race';
import { Result } from '@core/racing/domain/entities/Result';
import { Standing } from '@core/racing/domain/entities/Standing';
import type { FeedItem } from '@core/social/domain/types/FeedItem';
import type { SocialFriendSummary } from '@core/social/application/types/SocialUser';
import { faker } from '../../helpers/faker/faker';
import { getTeamLogo } from '../../helpers/images/images';
import {
createDrivers,
createLeagues,
createTeams,
createMemberships,
createRaces,
createResults,
createStandings,
createFriendships,
type RacingMembership,
type Friendship,
type DemoTeamDTO,
} from './RacingSeedCore';
import {
DEMO_SPONSORS,
createSeasonSponsorships,
createSponsorshipPricings,
createSponsorshipRequests,
type DemoSponsorDTO,
type DemoSeasonSponsorshipDTO,
type DemoSponsorshipRequestDTO,
type DemoSponsorshipPricingDTO,
} from './RacingSponsorshipSeed';
import {
createFeedEvents,
buildFriends,
buildTopLeagues,
buildUpcomingRaces,
buildLatestResults,
type RaceWithResultsDTO,
} from './RacingFeedSeed';
/**
* Aggregated racing seed data used by the website DI container
* and other demo infrastructure.
*/
export type RacingSeedData = {
drivers: Driver[];
leagues: League[];
races: Race[];
results: Result[];
standings: Standing[];
memberships: RacingMembership[];
friendships: Friendship[];
feedEvents: FeedItem[];
teams: DemoTeamDTO[];
sponsors: DemoSponsorDTO[];
seasonSponsorships: DemoSeasonSponsorshipDTO[];
sponsorshipRequests: DemoSponsorshipRequestDTO[];
sponsorshipPricings: DemoSponsorshipPricingDTO[];
};
/**
* Create the full static racing seed from the smaller core/sponsorship/feed modules.
*/
export function createStaticRacingSeed(seed: number): RacingSeedData {
faker.seed(seed);
const drivers = createDrivers(96);
const leagues = createLeagues(drivers.slice(0, 12).map((d) => d.id));
const teams = createTeams(leagues, getTeamLogo);
const memberships = createMemberships(drivers, leagues, teams);
const races = createRaces(leagues);
const results = createResults(drivers, races);
const friendships = createFriendships(drivers);
const feedEvents = createFeedEvents(drivers, leagues, races, friendships);
const standings = createStandings(leagues, results);
const sponsors = DEMO_SPONSORS;
const seasonSponsorships = createSeasonSponsorships(leagues, sponsors);
const sponsorshipPricings = createSponsorshipPricings(leagues, teams, drivers, races);
const sponsorshipRequests = createSponsorshipRequests(sponsors, leagues, teams, drivers, races);
return {
drivers,
leagues,
races,
results,
standings,
memberships,
friendships,
feedEvents,
teams,
sponsors,
seasonSponsorships,
sponsorshipRequests,
sponsorshipPricings,
};
}
/**
* Singleton seed used by website demo helpers.
*
* Alpha demo dataset (deterministic, in-memory only):
* - 90+ drivers across multiple leagues
* - Leagues with precomputed races, results and standings
* - Team memberships and friendships forming social “circles”
* - Feed events referencing real driver, league, race and team IDs
*/
const staticSeed = createStaticRacingSeed(42);
export const drivers = staticSeed.drivers;
export const leagues = staticSeed.leagues;
export const races = staticSeed.races;
export const results = staticSeed.results;
export const standings = staticSeed.standings;
export const teams = staticSeed.teams;
export const memberships = staticSeed.memberships;
export const friendships = staticSeed.friendships;
export const feedEvents = staticSeed.feedEvents;
export const sponsors = staticSeed.sponsors;
export const seasonSponsorships = staticSeed.seasonSponsorships;
export const sponsorshipRequests = staticSeed.sponsorshipRequests;
export const sponsorshipPricings = staticSeed.sponsorshipPricings;
/**
* Derived friend DTOs for UI consumption.
* This preserves the previous demo-data `friends` shape.
*/
export const friends: SocialFriendSummary[] = buildFriends(staticSeed.drivers, staticSeed.memberships);
/**
* Top leagues with banner URLs for UI.
*/
export const topLeagues = buildTopLeagues(leagues);
/**
* Re-export RaceWithResultsDTO and helpers for latest/upcoming races.
*/
export type { RaceWithResultsDTO } from './RacingFeedSeed';
export function getUpcomingRaces(limit?: number): readonly Race[] {
return buildUpcomingRaces(races, limit);
}
export function getLatestResults(limit?: number): readonly RaceWithResultsDTO[] {
return buildLatestResults(races, results, drivers, limit);
}
/**
* Demo league archetype helper for seeding structure and scoring.
* Kept here as the small, focused definition used by DI.
*/
export type DemoLeagueArchetype =
| {
id: 'sprint-series';
name: 'GridPilot Sprint Series';
structure: { mode: 'solo'; maxDrivers: 24 };
scoringPresetId: 'sprint-main-driver';
}
| {
id: 'endurance-cup';
name: 'GridPilot Endurance Cup';
structure: { mode: 'fixedTeams'; maxTeams: 12; driversPerTeam: 2 };
scoringPresetId: 'endurance-main-double';
}
| {
id: 'club-ladder';
name: 'GridPilot Club Ladder';
structure: { mode: 'solo'; maxDrivers: 40 };
scoringPresetId: 'club-default';
};
export function getDemoLeagueArchetypeByName(
leagueName: string,
): DemoLeagueArchetype | undefined {
switch (leagueName) {
case 'GridPilot Sprint Series':
return {
id: 'sprint-series',
name: 'GridPilot Sprint Series',
structure: { mode: 'solo', maxDrivers: 24 },
scoringPresetId: 'sprint-main-driver',
};
case 'GridPilot Endurance Cup':
return {
id: 'endurance-cup',
name: 'GridPilot Endurance Cup',
structure: { mode: 'fixedTeams', maxTeams: 12, driversPerTeam: 2 },
scoringPresetId: 'endurance-main-double',
};
case 'GridPilot Club Ladder':
return {
id: 'club-ladder',
name: 'GridPilot Club Ladder',
structure: { mode: 'solo', maxDrivers: 40 },
scoringPresetId: 'club-default',
};
default:
return undefined;
}
}