This commit is contained in:
2025-12-16 11:52:26 +01:00
parent ce82b7822b
commit 9a891ac8b3
586 changed files with 1320 additions and 1563 deletions

View File

@@ -5,7 +5,7 @@
* Immutable entity with factory methods and domain validation.
*/
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import { RacingDomainValidationError } from '../errors/RacingDomainError';
export type CarClass = 'formula' | 'gt' | 'prototype' | 'touring' | 'sports' | 'oval' | 'dirt';

View File

@@ -6,7 +6,7 @@
*/
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
export class Driver implements IEntity<string> {
readonly id: string;

View File

@@ -5,7 +5,7 @@
* Includes user-placed decals and league-specific overrides.
*/
import { RacingDomainValidationError, RacingDomainInvariantError, RacingDomainError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import type { LiveryDecal } from '../value-objects/LiveryDecal';

View File

@@ -1,5 +1,5 @@
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
export class Game implements IEntity<string> {
readonly id: string;

View File

@@ -6,7 +6,7 @@
*/
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
/**
* Stewarding decision mode for protests

View File

@@ -4,7 +4,7 @@
* Represents a driver's membership in a league and join requests.
*/
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import { RacingDomainValidationError } from '../errors/RacingDomainError';
export type MembershipRole = 'owner' | 'admin' | 'steward' | 'member';

View File

@@ -6,7 +6,7 @@
*/
import { RacingDomainValidationError, RacingDomainInvariantError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import type { Money } from '../value-objects/Money';
import type { Transaction } from './Transaction';

View File

@@ -5,7 +5,7 @@
* Contains base image and sponsor decal placements.
*/
import { RacingDomainValidationError, RacingDomainInvariantError, RacingDomainError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import type { LiveryDecal } from '../value-objects/LiveryDecal';

View File

@@ -6,7 +6,7 @@
*/
import { RacingDomainValidationError, RacingDomainInvariantError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
export type PenaltyType =
| 'time_penalty' // Add time to race result (e.g., +5 seconds)

View File

@@ -5,7 +5,7 @@
*/
import { RacingDomainValidationError, RacingDomainInvariantError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import type { Money } from '../value-objects/Money';

View File

@@ -12,7 +12,7 @@
* - withdrawn: Protesting driver withdrew the protest
*/
import { RacingDomainValidationError, RacingDomainInvariantError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
export type ProtestStatus = 'pending' | 'awaiting_defense' | 'under_review' | 'upheld' | 'dismissed' | 'withdrawn';

View File

@@ -6,7 +6,7 @@
*/
import { RacingDomainValidationError, RacingDomainInvariantError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import type { SessionType } from '../value-objects/SessionType';
export type RaceStatus = 'scheduled' | 'running' | 'completed' | 'cancelled';

View File

@@ -6,7 +6,7 @@
*/
import { RacingDomainValidationError, RacingDomainInvariantError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import type { Session } from './Session';
import type { SessionType } from '../value-objects/SessionType';

View File

@@ -4,7 +4,7 @@
* Represents a registration of a driver for a specific race.
*/
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import { RacingDomainValidationError } from '../errors/RacingDomainError';
export interface RaceRegistrationProps {

View File

@@ -6,7 +6,7 @@
*/
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
export class Result implements IEntity<string> {
readonly id: string;

View File

@@ -3,7 +3,7 @@
*/
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import { RaceIncidents, type IncidentRecord } from '../value-objects/RaceIncidents';
export class ResultWithIncidents implements IEntity<string> {

View File

@@ -9,7 +9,7 @@ import {
RacingDomainInvariantError,
RacingDomainValidationError,
} from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import type { SeasonSchedule } from '../value-objects/SeasonSchedule';
import type { SeasonScoringConfig } from '../value-objects/SeasonScoringConfig';
import type { SeasonDropPolicy } from '../value-objects/SeasonDropPolicy';

View File

@@ -6,7 +6,7 @@
*/
import { RacingDomainValidationError, RacingDomainInvariantError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import type { Money } from '../value-objects/Money';

View File

@@ -6,7 +6,7 @@
*/
import { RacingDomainValidationError, RacingDomainInvariantError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import type { SessionType } from '../value-objects/SessionType';
export type SessionStatus = 'scheduled' | 'running' | 'completed' | 'cancelled';

View File

@@ -5,7 +5,7 @@
* Aggregate root for sponsor information.
*/
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
export interface SponsorProps {
id: string;

View File

@@ -6,7 +6,7 @@
*/
import { RacingDomainValidationError, RacingDomainInvariantError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import type { Money } from '../value-objects/Money';
import type { SponsorshipTier } from './SeasonSponsorship';

View File

@@ -6,7 +6,7 @@
*/
import { RacingDomainError, RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
export class Standing implements IEntity<string> {
readonly id: string;

View File

@@ -6,7 +6,7 @@
* basic invariants around identity and core properties.
*/
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
import { RacingDomainValidationError } from '../errors/RacingDomainError';
export class Team implements IEntity<string> {

View File

@@ -6,7 +6,7 @@
*/
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
export type TrackCategory = 'oval' | 'road' | 'street' | 'dirt';
export type TrackDifficulty = 'beginner' | 'intermediate' | 'advanced' | 'expert';

View File

@@ -7,7 +7,7 @@
import { RacingDomainValidationError, RacingDomainInvariantError } from '../errors/RacingDomainError';
import type { Money } from '../value-objects/Money';
import type { IEntity } from '@gridpilot/shared/domain';
import type { IEntity } from '@core/shared/domain';
export type TransactionType =
| 'sponsorship_payment'

View File

@@ -1,4 +1,4 @@
import type { IDomainError, CommonDomainErrorKind } from '@gridpilot/shared/errors';
import type { IDomainError, CommonDomainErrorKind } from '@core/shared/errors';
export abstract class RacingDomainError extends Error implements IDomainError<CommonDomainErrorKind> {
readonly type = 'domain' as const;

View File

@@ -1,4 +1,4 @@
import type { IDomainEvent } from '@gridpilot/shared/domain';
import type { IDomainEvent } from '@core/shared/domain';
/**
* Domain Event: MainRaceCompleted

View File

@@ -1,4 +1,4 @@
import type { IDomainEvent } from '@gridpilot/shared/domain';
import type { IDomainEvent } from '@core/shared/domain';
/**
* Domain Event: RaceEventStewardingClosed

View File

@@ -1,5 +1,5 @@
import type { DropScorePolicy } from '../types/DropScorePolicy';
import type { IDomainCalculationService } from '@gridpilot/shared/domain';
import type { IDomainCalculationService } from '@core/shared/domain';
export interface EventPointsEntry {
eventId: string;

View File

@@ -7,7 +7,7 @@ import type { BonusRule } from '../types/BonusRule';
import type { ChampionshipType } from '../types/ChampionshipType';
import type { PointsTable } from '../value-objects/PointsTable';
import type { IDomainCalculationService } from '@gridpilot/shared/domain';
import type { IDomainCalculationService } from '@core/shared/domain';
export interface ParticipantEventPoints {
participant: ParticipantRef;

View File

@@ -1,4 +1,4 @@
import type { IDomainService } from '@gridpilot/shared/domain';
import type { IDomainService } from '@core/shared/domain';
export interface DriverStats {
rating: number;

View File

@@ -1,4 +1,4 @@
import type { IDomainService } from '@gridpilot/shared/domain';
import type { IDomainService } from '@core/shared/domain';
export interface DriverRanking {
driverId: string;

View File

@@ -5,7 +5,7 @@ import { RacingDomainError, RacingDomainValidationError } from '../errors/Racing
import { RaceTimeOfDay } from '../value-objects/RaceTimeOfDay';
import type { Weekday } from '../types/Weekday';
import { weekdayToIndex } from '../types/Weekday';
import type { IDomainCalculationService } from '@gridpilot/shared/domain';
import type { IDomainCalculationService } from '@core/shared/domain';
function cloneDate(date: Date): Date {
return new Date(date.getTime());

View File

@@ -1,4 +1,4 @@
import type { IDomainService } from '@gridpilot/shared/domain';
import type { IDomainService } from '@core/shared/domain';
export type SkillLevel = 'beginner' | 'intermediate' | 'advanced' | 'pro';

View File

@@ -1,4 +1,4 @@
import type { IDomainCalculationService } from '@gridpilot/shared/domain';
import type { IDomainCalculationService } from '@core/shared/domain';
/**
* Domain Service: StrengthOfFieldCalculator

View File

@@ -5,7 +5,7 @@
* Different sim racing games have different maximum grid sizes.
*/
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export interface GameConstraintsData {
readonly maxDrivers: number;

View File

@@ -5,7 +5,7 @@
*/
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export interface LeagueDescriptionValidationResult {
valid: boolean;

View File

@@ -5,7 +5,7 @@
*/
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export interface LeagueNameValidationResult {
valid: boolean;

View File

@@ -1,5 +1,5 @@
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export interface LeagueTimezoneProps {
id: string;

View File

@@ -9,7 +9,7 @@
* Can have any number of players.
*/
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
import { RacingDomainValidationError } from '../errors/RacingDomainError';
export type LeagueVisibilityType = 'ranked' | 'unranked';

View File

@@ -4,7 +4,7 @@
*/
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export type DecalType = 'sponsor' | 'user';

View File

@@ -6,7 +6,7 @@
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { Money } from './Money';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export type MembershipFeeType = 'season' | 'monthly' | 'per_race';

View File

@@ -4,7 +4,7 @@
*/
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export type Currency = 'USD' | 'EUR' | 'GBP';

View File

@@ -1,5 +1,5 @@
import type { Weekday } from '../types/Weekday';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export interface MonthlyRecurrencePatternProps {
ordinal: 1 | 2 | 3 | 4;

View File

@@ -1,4 +1,4 @@
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export interface PointsTableProps {
pointsByPosition: Map<number, number>;

View File

@@ -1,4 +1,4 @@
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
/**
* Incident types that can occur during a race

View File

@@ -1,5 +1,5 @@
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export interface RaceTimeOfDayProps {
hour: number;

View File

@@ -1,7 +1,7 @@
import { LeagueTimezone } from './LeagueTimezone';
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export interface ScheduledRaceSlotProps {
roundNumber: number;

View File

@@ -1,5 +1,5 @@
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export type SeasonDropStrategy = 'none' | 'bestNResults' | 'dropWorstN';

View File

@@ -2,7 +2,7 @@ import { RaceTimeOfDay } from './RaceTimeOfDay';
import { LeagueTimezone } from './LeagueTimezone';
import type { RecurrenceStrategy } from './RecurrenceStrategy';
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export interface SeasonScheduleProps {
startDate: Date;

View File

@@ -1,5 +1,5 @@
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
/**
* Value Object: SeasonScoringConfig

View File

@@ -1,5 +1,5 @@
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
import type { StewardingDecisionMode } from '../entities/League';
export interface SeasonStewardingConfigProps {

View File

@@ -1,5 +1,5 @@
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
/**
* Value Object: SessionType

View File

@@ -6,7 +6,7 @@
*/
import { Money } from './Money';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export interface SponsorshipSlotConfig {
tier: 'main' | 'secondary';

View File

@@ -1,7 +1,7 @@
import type { Weekday } from '../types/Weekday';
import { weekdayToIndex } from '../types/Weekday';
import { RacingDomainValidationError } from '../errors/RacingDomainError';
import type { IValueObject } from '@gridpilot/shared/domain';
import type { IValueObject } from '@core/shared/domain';
export interface WeekdaySetProps {
days: Weekday[];