refactor racing use cases

This commit is contained in:
2025-12-21 00:43:42 +01:00
parent e9d6f90bb2
commit c12656d671
308 changed files with 14401 additions and 7419 deletions

View File

@@ -1,4 +0,0 @@
export interface AcceptSponsorshipInputPort {
requestId: string;
respondedBy: string; // driverId of the person accepting
}

View File

@@ -1,4 +0,0 @@
export interface ApproveLeagueJoinRequestInputPort {
leagueId: string;
requestId: string;
}

View File

@@ -1,4 +0,0 @@
export interface ApproveTeamJoinRequestInputPort {
teamId: string;
requestId: string;
}

View File

@@ -1,3 +0,0 @@
export interface CancelRaceInputPort {
raceId: string;
}

View File

@@ -1,9 +0,0 @@
/**
* Command for closing race event stewarding.
*
* Scheduled job that checks for race events with expired stewarding windows
* and closes them, triggering final results notifications.
*/
export interface CloseRaceEventStewardingInputPort {
// No parameters needed - finds all expired events automatically
}

View File

@@ -1,9 +0,0 @@
export interface CompleteDriverOnboardingInputPort {
userId: string;
firstName: string;
lastName: string;
displayName: string;
country: string;
timezone?: string;
bio?: string;
}

View File

@@ -1,3 +0,0 @@
export interface CompleteRaceInputPort {
raceId: string;
}

View File

@@ -1,19 +0,0 @@
export interface CreateLeagueWithSeasonAndScoringInputPort {
name: string;
description?: string;
/**
* League visibility/ranking mode.
* - 'ranked' (or legacy 'public'): Competitive, public, affects ratings. Requires min 10 drivers.
* - 'unranked' (or legacy 'private'): Casual with friends, no rating impact.
*/
visibility: 'ranked' | 'unranked' | 'public' | 'private';
ownerId: string;
gameId: string;
maxDrivers?: number;
maxTeams?: number;
enableDriverChampionship: boolean;
enableTeamChampionship: boolean;
enableNationsChampionship: boolean;
enableTrophyChampionship: boolean;
scoringPresetId?: string;
}

View File

@@ -1,6 +0,0 @@
export interface CreateSponsorInputPort {
name: string;
contactEmail: string;
websiteUrl?: string;
logoUrl?: string;
}

View File

@@ -1,7 +0,0 @@
export interface CreateTeamInputPort {
name: string;
tag: string;
description: string;
ownerId: string;
leagues: string[];
}

View File

@@ -1,3 +0,0 @@
export interface DashboardOverviewInputPort {
driverId: string;
}

View File

@@ -1,3 +0,0 @@
export interface DriverTeamInputPort {
driverId: string;
}

View File

@@ -1,14 +0,0 @@
export interface FileProtestInputPort {
raceId: string;
protestingDriverId: string;
accusedDriverId: string;
incident: {
sessionType: string;
lapNumber: number;
cornerNumber?: number;
description: string;
severity: 'minor' | 'major' | 'severe';
};
comment?: string;
proofVideoUrl?: string;
}

View File

@@ -1,3 +0,0 @@
export interface GetDriverAvatarInputPort {
driverId: string;
}

View File

@@ -1,3 +0,0 @@
export interface GetDriverRatingInputPort {
driverId: string;
}

View File

@@ -1,4 +0,0 @@
export interface GetEntitySponsorshipPricingInputPort {
entityType: 'league' | 'team' | 'driver';
entityId: string;
}

View File

@@ -1,3 +0,0 @@
export interface GetLeagueCoverInputPort {
leagueId: string;
}

View File

@@ -1,3 +0,0 @@
export interface GetLeagueLogoInputPort {
leagueId: string;
}

View File

@@ -1,3 +0,0 @@
export interface GetLeagueScoringPresetByIdInputPort {
presetId: string;
}

View File

@@ -1,3 +0,0 @@
export interface GetTeamLogoInputPort {
teamId: string;
}

View File

@@ -1,4 +0,0 @@
export interface IsDriverRegisteredForRaceInputPort {
raceId: string;
driverId: string;
}

View File

@@ -1,4 +0,0 @@
export interface JoinLeagueInputPort {
leagueId: string;
driverId: string;
}

View File

@@ -1,4 +0,0 @@
export interface JoinTeamInputPort {
teamId: string;
driverId: string;
}

View File

@@ -1,3 +0,0 @@
export interface LeagueJoinRequestsInputPort {
leagueId: string;
}

View File

@@ -1,8 +0,0 @@
/**
* League visibility/ranking mode.
* - 'ranked' (or legacy 'public'): Competitive, public, affects driver ratings. Min 10 drivers.
* - 'unranked' (or legacy 'private'): Casual with friends, no rating impact.
*/
export interface LeagueVisibilityInputPort {
visibility: 'ranked' | 'unranked' | 'public' | 'private';
}

View File

@@ -1,4 +0,0 @@
export interface LeaveTeamInputPort {
teamId: string;
driverId: string;
}

View File

@@ -1,3 +0,0 @@
export interface ListLeagueScoringPresetsInputPort {
// Empty interface for query with no parameters
}

View File

@@ -1,6 +0,0 @@
export interface ProcessPaymentInputPort {
amount: number; // in cents
payerId: string;
description: string;
metadata?: Record<string, unknown>;
}

View File

@@ -1,3 +0,0 @@
export interface GetRaceRegistrationsInputPort {
raceId: string;
}

View File

@@ -1,8 +0,0 @@
export interface RefundPaymentInputPort {
originalTransactionId: string;
amount: {
value: number;
currency: string;
};
reason: string;
}

View File

@@ -1,5 +0,0 @@
export interface RegisterForRaceInputPort {
raceId: string;
leagueId: string;
driverId: string;
}

View File

@@ -1,3 +0,0 @@
export interface RejectTeamJoinRequestInputPort {
requestId: string;
}

View File

@@ -1,4 +0,0 @@
export interface TeamDetailsInputPort {
teamId: string;
driverId: string;
}

View File

@@ -1,3 +0,0 @@
export interface TeamJoinRequestsInputPort {
teamId: string;
}

View File

@@ -1,3 +0,0 @@
export interface TeamMembersInputPort {
teamId: string;
}

View File

@@ -1,10 +0,0 @@
export interface UpdateTeamInputPort {
teamId: string;
updates: {
name?: string;
tag?: string;
description?: string;
leagues?: string[];
};
updatedBy: string;
}

View File

@@ -1,3 +0,0 @@
export interface VerifyPaymentInputPort {
transactionId: string;
}

View File

@@ -1,4 +0,0 @@
export interface WithdrawFromRaceInputPort {
raceId: string;
driverId: string;
}

View File

@@ -1,8 +0,0 @@
export interface AcceptSponsorshipOutputPort {
requestId: string;
sponsorshipId: string;
status: 'accepted';
acceptedAt: Date;
platformFee: number;
netAmount: number;
}

View File

@@ -1,18 +0,0 @@
import type { League } from '../../../domain/entities/League';
import type { Season } from '../../../domain/entities/season/Season';
import type { LeagueScoringConfig } from '../../../domain/entities/LeagueScoringConfig';
import type { Game } from '../../../domain/entities/Game';
import type { LeagueScoringPresetOutputPort } from './LeagueScoringPresetOutputPort';
export interface LeagueEnrichedData {
league: League;
usedDriverSlots: number;
season?: Season;
scoringConfig?: LeagueScoringConfig;
game?: Game;
preset?: LeagueScoringPresetOutputPort;
}
export interface AllLeaguesWithCapacityAndScoringOutputPort {
leagues: LeagueEnrichedData[];
}

View File

@@ -1,6 +0,0 @@
import type { League } from '../../domain/entities/League';
export interface AllLeaguesWithCapacityOutputPort {
leagues: League[];
memberCounts: Record<string, number>;
}

View File

@@ -1,22 +0,0 @@
export type AllRacesStatus = 'scheduled' | 'running' | 'completed' | 'cancelled' | 'all';
export interface AllRacesListItem {
id: string;
track: string;
car: string;
scheduledAt: string;
status: 'scheduled' | 'running' | 'completed' | 'cancelled';
leagueId: string;
leagueName: string;
strengthOfField: number | null;
}
export interface AllRacesFilterOptions {
statuses: { value: AllRacesStatus; label: string }[];
leagues: { id: string; name: string }[];
}
export interface AllRacesPageOutputPort {
races: AllRacesListItem[];
filters: AllRacesFilterOptions;
}

View File

@@ -1,5 +0,0 @@
export interface ApplyForSponsorshipResultPort {
requestId: string;
status: 'pending';
createdAt: Date;
}

View File

@@ -1,4 +0,0 @@
export interface ApproveLeagueJoinRequestOutputPort {
success: boolean;
message: string;
}

View File

@@ -1,4 +0,0 @@
export interface ApproveLeagueJoinRequestResultPort {
success: boolean;
message: string;
}

View File

@@ -1,16 +0,0 @@
export interface ChampionshipStandingsOutputPort {
seasonId: string;
championshipId: string;
championshipName: string;
rows: {
participant: {
id: string;
type: 'driver' | 'team';
name: string;
};
position: number;
totalPoints: number;
resultsCounted: number;
resultsDropped: number;
}[];
}

View File

@@ -1,11 +0,0 @@
export interface ChampionshipStandingsRowOutputPort {
participant: {
id: string;
type: 'driver' | 'team';
name: string;
};
position: number;
totalPoints: number;
resultsCounted: number;
resultsDropped: number;
}

View File

@@ -1,3 +0,0 @@
export interface CompleteDriverOnboardingOutputPort {
driverId: string;
}

View File

@@ -1,4 +0,0 @@
export interface CreateLeagueOutputPort {
leagueId: string;
success: boolean;
}

View File

@@ -1,6 +0,0 @@
export interface CreateLeagueWithSeasonAndScoringOutputPort {
leagueId: string;
seasonId: string;
scoringPresetId?: string;
scoringPresetName?: string;
}

View File

@@ -1,10 +0,0 @@
export interface CreateSponsorOutputPort {
sponsor: {
id: string;
name: string;
contactEmail: string;
websiteUrl?: string;
logoUrl?: string;
createdAt: Date;
};
}

View File

@@ -1,11 +0,0 @@
export interface CreateTeamOutputPort {
team: {
id: string;
name: string;
tag: string;
description: string;
ownerId: string;
leagues: string[];
createdAt: Date;
};
}

View File

@@ -1,85 +0,0 @@
import type { FeedItemType } from '@core/social/domain/types/FeedItemType';
export interface DashboardDriverSummaryOutputPort {
id: string;
name: string;
country: string;
avatarUrl: string;
rating: number | null;
globalRank: number | null;
totalRaces: number;
wins: number;
podiums: number;
consistency: number | null;
}
export interface DashboardRaceSummaryOutputPort {
id: string;
leagueId: string;
leagueName: string;
track: string;
car: string;
scheduledAt: string;
status: 'scheduled' | 'running' | 'completed' | 'cancelled';
isMyLeague: boolean;
}
export interface DashboardRecentResultOutputPort {
raceId: string;
raceName: string;
leagueId: string;
leagueName: string;
finishedAt: string;
position: number;
incidents: number;
}
export interface DashboardLeagueStandingSummaryOutputPort {
leagueId: string;
leagueName: string;
position: number;
totalDrivers: number;
points: number;
}
export interface DashboardFeedItemSummaryOutputPort {
id: string;
type: FeedItemType;
headline: string;
body?: string;
timestamp: string;
ctaLabel?: string;
ctaHref?: string;
}
export interface DashboardFeedSummaryOutputPort {
notificationCount: number;
items: DashboardFeedItemSummaryOutputPort[];
}
export interface DashboardFriendSummaryOutputPort {
id: string;
name: string;
country: string;
avatarUrl: string;
}
export interface DashboardOverviewOutputPort {
currentDriver: DashboardDriverSummaryOutputPort | null;
myUpcomingRaces: DashboardRaceSummaryOutputPort[];
otherUpcomingRaces: DashboardRaceSummaryOutputPort[];
/**
* All upcoming races for the driver, already sorted by scheduledAt ascending.
*/
upcomingRaces: DashboardRaceSummaryOutputPort[];
/**
* Count of distinct leagues that are currently "active" for the driver,
* based on upcoming races and league standings.
*/
activeLeaguesCount: number;
nextRace: DashboardRaceSummaryOutputPort | null;
recentResults: DashboardRecentResultOutputPort[];
leagueStandingsSummaries: DashboardLeagueStandingSummaryOutputPort[];
feedSummary: DashboardFeedSummaryOutputPort;
friends: DashboardFriendSummaryOutputPort[];
}

View File

@@ -1,8 +0,0 @@
export interface DriverOutputPort {
id: string;
iracingId: string;
name: string;
country: string;
bio?: string;
joinedAt: string;
}

View File

@@ -1,5 +0,0 @@
export interface DriverRegistrationStatusOutputPort {
isRegistered: boolean;
raceId: string;
driverId: string;
}

View File

@@ -1,4 +0,0 @@
export interface DriverOutputPort {
id: string;
name: string;
}

View File

@@ -1,19 +0,0 @@
export interface DriverTeamOutputPort {
driverId: string;
team: {
id: string;
name: string;
tag: string;
description: string;
ownerId: string;
leagues: string[];
createdAt: Date;
};
membership: {
teamId: string;
driverId: string;
role: 'owner' | 'manager' | 'driver';
status: 'active' | 'pending' | 'none';
joinedAt: Date;
};
}

View File

@@ -1,22 +0,0 @@
import type { SkillLevel } from '../../domain/services/SkillLevelService';
export interface DriverLeaderboardItemOutputPort {
id: string;
name: string;
rating: number;
skillLevel: SkillLevel;
nationality: string;
racesCompleted: number;
wins: number;
podiums: number;
isActive: boolean;
rank: number;
avatarUrl: string;
}
export interface DriversLeaderboardOutputPort {
drivers: DriverLeaderboardItemOutputPort[];
totalRaces: number;
totalWins: number;
activeCount: number;
}

View File

@@ -1,13 +0,0 @@
export interface GetAllRacesOutputPort {
races: {
id: string;
leagueId: string;
track: string;
car: string;
status: 'scheduled' | 'running' | 'completed' | 'cancelled';
scheduledAt: string;
strengthOfField: number | null;
leagueName: string;
}[];
totalCount: number;
}

View File

@@ -1,13 +0,0 @@
export interface GetAllTeamsOutputPort {
teams: Array<{
id: string;
name: string;
tag: string;
description: string;
ownerId: string;
leagues: string[];
createdAt: Date;
memberCount: number;
}>;
totalCount?: number;
}

View File

@@ -1,3 +0,0 @@
export interface GetDriverAvatarOutputPort {
avatarUrl: string;
}

View File

@@ -1,4 +0,0 @@
export interface GetDriverRatingOutputPort {
rating: number | null;
ratingChange: number | null;
}

View File

@@ -1,28 +0,0 @@
export interface GetEntitySponsorshipPricingOutputPort {
entityType: 'league' | 'team' | 'driver';
entityId: string;
acceptingApplications: boolean;
customRequirements?: string;
mainSlot?: {
tier: string;
price: number;
currency: string;
formattedPrice: string;
benefits: string[];
available: boolean;
maxSlots: number;
filledSlots: number;
pendingRequests: number;
};
secondarySlot?: {
tier: string;
price: number;
currency: string;
formattedPrice: string;
benefits: string[];
available: boolean;
maxSlots: number;
filledSlots: number;
pendingRequests: number;
};
}

View File

@@ -1,4 +0,0 @@
export interface GetLeagueAdminOutputPort {
leagueId: string;
ownerId: string;
}

View File

@@ -1,4 +0,0 @@
export interface GetLeagueAdminPermissionsOutputPort {
canRemoveMember: boolean;
canUpdateRoles: boolean;
}

View File

@@ -1,3 +0,0 @@
export interface GetLeagueCoverOutputPort {
coverUrl: string;
}

View File

@@ -1,12 +0,0 @@
export interface LeagueJoinRequestOutputPort {
id: string;
leagueId: string;
driverId: string;
requestedAt: Date;
message: string;
driver: { id: string; name: string } | null;
}
export interface GetLeagueJoinRequestsOutputPort {
joinRequests: LeagueJoinRequestOutputPort[];
}

View File

@@ -1,3 +0,0 @@
export interface GetLeagueLogoOutputPort {
logoUrl: string;
}

View File

@@ -1,14 +0,0 @@
export interface LeagueMembershipOutputPort {
driverId: string;
driver: { id: string; name: string };
role: string;
joinedAt: Date;
}
export interface LeagueMembershipsOutputPort {
members: LeagueMembershipOutputPort[];
}
export interface GetLeagueMembershipsOutputPort {
memberships: LeagueMembershipsOutputPort;
}

View File

@@ -1,9 +0,0 @@
export interface LeagueOwnerSummaryOutputPort {
driver: { id: string; iracingId: string; name: string; country: string; bio: string | undefined; joinedAt: string };
rating: number;
rank: number;
}
export interface GetLeagueOwnerSummaryOutputPort {
summary: LeagueOwnerSummaryOutputPort | null;
}

View File

@@ -1,47 +0,0 @@
export interface ProtestOutputPort {
id: string;
raceId: string;
protestingDriverId: string;
accusedDriverId: string;
incident: { lap: number; description: string; timeInRace: number | undefined };
comment: string | undefined;
proofVideoUrl: string | undefined;
status: string;
reviewedBy: string | undefined;
decisionNotes: string | undefined;
filedAt: string;
reviewedAt: string | undefined;
defense: { statement: string; videoUrl: string | undefined; submittedAt: string } | undefined;
defenseRequestedAt: string | undefined;
defenseRequestedBy: string | undefined;
}
export interface RaceOutputPort {
id: string;
leagueId: string;
scheduledAt: string;
track: string;
trackId: string | undefined;
car: string;
carId: string | undefined;
sessionType: string;
status: string;
strengthOfField: number | undefined;
registeredCount: number | undefined;
maxParticipants: number | undefined;
}
export interface DriverOutputPort {
id: string;
iracingId: string;
name: string;
country: string;
bio: string | undefined;
joinedAt: string;
}
export interface GetLeagueProtestsOutputPort {
protests: ProtestOutputPort[];
racesById: Record<string, RaceOutputPort>;
driversById: Record<string, DriverOutputPort>;
}

View File

@@ -1,7 +0,0 @@
export interface GetLeagueScheduleOutputPort {
races: Array<{
id: string;
name: string;
scheduledAt: Date;
}>;
}

View File

@@ -1,13 +0,0 @@
export interface LeagueSeasonSummaryOutputPort {
seasonId: string;
name: string;
status: string;
startDate: Date;
endDate: Date;
isPrimary: boolean;
isParallelActive: boolean;
}
export interface GetLeagueSeasonsOutputPort {
seasons: LeagueSeasonSummaryOutputPort[];
}

View File

@@ -1,23 +0,0 @@
export interface WalletTransactionOutputPort {
id: string;
type: 'sponsorship' | 'membership' | 'withdrawal' | 'prize';
description: string;
amount: number;
fee: number;
netAmount: number;
date: string;
status: 'completed' | 'pending' | 'failed';
reference?: string;
}
export interface GetLeagueWalletOutputPort {
balance: number;
currency: string;
totalRevenue: number;
totalFees: number;
totalWithdrawals: number;
pendingPayouts: number;
canWithdraw: boolean;
withdrawalBlockReason?: string;
transactions: WalletTransactionOutputPort[];
}

View File

@@ -1,10 +0,0 @@
export interface GetSponsorsOutputPort {
sponsors: {
id: string;
name: string;
contactEmail: string;
websiteUrl: string | undefined;
logoUrl: string | undefined;
createdAt: Date;
}[];
}

View File

@@ -1,10 +0,0 @@
export interface GetSponsorshipPricingOutputPort {
entityType: string;
entityId: string;
pricing: {
id: string;
level: string;
price: number;
currency: string;
}[];
}

View File

@@ -1,17 +0,0 @@
export interface GetTeamDetailsOutputPort {
team: {
id: string;
name: string;
tag: string;
description: string;
ownerId: string;
leagues: string[];
createdAt: Date;
};
membership: {
role: 'owner' | 'manager' | 'member';
joinedAt: Date;
isActive: boolean;
} | null;
canManage: boolean;
}

View File

@@ -1,3 +0,0 @@
export interface GetTeamLogoOutputPort {
logoUrl: string;
}

View File

@@ -1,3 +0,0 @@
export interface GetTotalLeaguesOutputPort {
totalLeagues: number;
}

View File

@@ -1,3 +0,0 @@
export interface GetTotalRacesOutputPort {
totalRaces: number;
}

View File

@@ -1,8 +0,0 @@
export interface ImportRaceResultsApiOutputPort {
success: boolean;
raceId: string;
leagueId: string;
driversProcessed: number;
resultsRecorded: number;
errors?: string[];
}

View File

@@ -1,5 +0,0 @@
export interface JoinLeagueOutputPort {
membershipId: string;
leagueId: string;
status: string;
}

View File

@@ -1,25 +0,0 @@
export interface LeagueDriverSeasonStatsItemOutputPort {
leagueId: string;
driverId: string;
position: number;
driverName: string;
teamId?: string;
teamName?: string;
totalPoints: number;
basePoints: number;
penaltyPoints: number;
bonusPoints: number;
pointsPerRace: number;
racesStarted: number;
racesFinished: number;
dnfs: number;
noShows: number;
avgFinish: number | null;
rating: number | null;
ratingChange: number | null;
}
export interface LeagueDriverSeasonStatsOutputPort {
leagueId: string;
stats: LeagueDriverSeasonStatsItemOutputPort[];
}

View File

@@ -1,11 +0,0 @@
import type { League } from '../../domain/entities/League';
import type { Season } from '../../domain/entities/Season';
import type { LeagueScoringConfig } from '../../domain/entities/LeagueScoringConfig';
import type { Game } from '../../domain/entities/Game';
export interface LeagueFullConfigOutputPort {
league: League;
activeSeason?: Season;
scoringConfig?: LeagueScoringConfig;
game?: Game;
}

View File

@@ -1,20 +0,0 @@
export interface LeagueOutputPort {
id: string;
name: string;
description: string;
ownerId: string;
settings: {
pointsSystem: 'f1-2024' | 'indycar' | 'custom';
sessionDuration?: number;
qualifyingFormat?: 'single-lap' | 'open';
customPoints?: Record<number, number>;
maxDrivers?: number;
};
createdAt: string;
socialLinks?: {
discordUrl?: string;
youtubeUrl?: string;
websiteUrl?: string;
};
usedSlots?: number;
}

View File

@@ -1,11 +0,0 @@
export interface LeagueScheduleOutputPort {
seasonStartDate: string;
raceStartTime: string;
timezoneId: string;
recurrenceStrategy: 'weekly' | 'everyNWeeks' | 'monthlyNthWeekday';
intervalWeeks?: number;
weekdays?: ('monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday')[];
monthlyOrdinal?: 1 | 2 | 3 | 4;
monthlyWeekday?: 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday';
plannedRounds: number;
}

View File

@@ -1,4 +0,0 @@
export interface LeagueSchedulePreviewOutputPort {
rounds: Array<{ roundNumber: number; scheduledAt: string; timezoneId: string }>;
summary: string;
}

View File

@@ -1,9 +0,0 @@
export interface LeagueScoringChampionshipOutputPort {
id: string;
name: string;
type: 'driver' | 'team' | 'nations' | 'trophy';
sessionTypes: string[];
pointsPreview: Array<{ sessionType: string; position: number; points: number }>;
bonusSummary: string[];
dropPolicyDescription: string;
}

View File

@@ -1,12 +0,0 @@
import type { ChampionshipConfig } from '../../domain/types/ChampionshipConfig';
import type { LeagueScoringPresetOutputPort } from './LeagueScoringPresetOutputPort';
export interface LeagueScoringConfigOutputPort {
leagueId: string;
seasonId: string;
gameId: string;
gameName: string;
scoringPresetId?: string;
preset?: LeagueScoringPresetOutputPort;
championships: ChampionshipConfig[];
}

View File

@@ -1,9 +0,0 @@
export interface LeagueScoringPresetOutputPort {
id: string;
name: string;
description: string;
primaryChampionshipType: 'driver' | 'team' | 'nations' | 'trophy';
sessionSummary: string;
bonusSummary: string;
dropPolicySummary: string;
}

View File

@@ -1,5 +0,0 @@
import type { LeagueScoringPresetOutputPort } from './LeagueScoringPresetOutputPort';
export interface LeagueScoringPresetsOutputPort {
presets: LeagueScoringPresetOutputPort[];
}

View File

@@ -1,10 +0,0 @@
export interface StandingItemOutputPort {
driverId: string;
driver: { id: string; name: string };
points: number;
rank: number;
}
export interface LeagueStandingsOutputPort {
standings: StandingItemOutputPort[];
}

View File

@@ -1,5 +0,0 @@
export interface LeagueStatsOutputPort {
totalMembers: number;
totalRaces: number;
averageRating: number;
}

View File

@@ -1,23 +0,0 @@
export interface LeagueSummaryOutputPort {
id: string;
name: string;
description?: string;
createdAt: Date;
ownerId: string;
maxDrivers?: number;
usedDriverSlots?: number;
maxTeams?: number;
usedTeamSlots?: number;
structureSummary?: string;
scoringPatternSummary?: string;
timingSummary?: string;
scoring?: {
gameId: string;
gameName: string;
primaryChampionshipType: 'driver' | 'team' | 'nations' | 'trophy';
scoringPresetId: string;
scoringPresetName: string;
dropPolicySummary: string;
scoringPatternSummary: string;
};
}

View File

@@ -1,9 +0,0 @@
export interface LeagueSummaryScoringOutputPort {
gameId: string;
gameName: string;
primaryChampionshipType: 'driver' | 'team' | 'nations' | 'trophy';
scoringPresetId: string;
scoringPresetName: string;
dropPolicySummary: string;
scoringPatternSummary: string;
}

View File

@@ -1,24 +0,0 @@
import type { SponsorableEntityType } from '../../domain/entities/SponsorshipRequest';
import type { SponsorshipTier } from '../../domain/entities/SeasonSponsorship';
export interface PendingSponsorshipRequestOutput {
id: string;
sponsorId: string;
sponsorName: string;
sponsorLogo?: string;
tier: SponsorshipTier;
offeredAmount: number;
currency: string;
formattedAmount: string;
message?: string;
createdAt: Date;
platformFee: number;
netAmount: number;
}
export interface PendingSponsorshipRequestsOutputPort {
entityType: SponsorableEntityType;
entityId: string;
requests: PendingSponsorshipRequestOutput[];
totalCount: number;
}

View File

@@ -1,6 +0,0 @@
export interface ProcessPaymentOutputPort {
success: boolean;
transactionId?: string;
error?: string;
timestamp: Date;
}

View File

@@ -1,78 +0,0 @@
export interface ProfileOverviewOutputPort {
driver: {
id: string;
name: string;
country: string;
avatarUrl: string;
iracingId: string | null;
joinedAt: Date;
rating: number | null;
globalRank: number | null;
consistency: number | null;
bio: string | null;
totalDrivers: number | null;
};
stats: {
totalRaces: number;
wins: number;
podiums: number;
dnfs: number;
avgFinish: number | null;
bestFinish: number | null;
worstFinish: number | null;
finishRate: number | null;
winRate: number | null;
podiumRate: number | null;
percentile: number | null;
rating: number | null;
consistency: number | null;
overallRank: number | null;
} | null;
finishDistribution: {
totalRaces: number;
wins: number;
podiums: number;
topTen: number;
dnfs: number;
other: number;
} | null;
teamMemberships: {
teamId: string;
teamName: string;
teamTag: string | null;
role: string;
joinedAt: Date;
isCurrent: boolean;
}[];
socialSummary: {
friendsCount: number;
friends: {
id: string;
name: string;
country: string;
avatarUrl: string;
}[];
};
extendedProfile: {
socialHandles: {
platform: 'twitter' | 'youtube' | 'twitch' | 'discord';
handle: string;
url: string;
}[];
achievements: {
id: string;
title: string;
description: string;
icon: 'trophy' | 'medal' | 'star' | 'crown' | 'target' | 'zap';
rarity: 'common' | 'rare' | 'epic' | 'legendary';
earnedAt: string;
}[];
racingStyle: string;
favoriteTrack: string;
favoriteCar: string;
timezone: string;
availableHours: string;
lookingForTeam: boolean;
openToRequests: boolean;
} | null;
}

View File

@@ -1,9 +0,0 @@
export interface ProtestOutputPort {
id: string;
raceId: string;
protestingDriverId: string;
accusedDriverId: string;
submittedAt: Date;
description: string;
status: string;
}

View File

@@ -1,15 +0,0 @@
import type { Race } from '../../../domain/entities/Race';
import type { League } from '../../../domain/entities/League';
import type { RaceRegistration } from '../../../domain/entities/RaceRegistration';
import type { Driver } from '../../../domain/entities/Driver';
import type { Result } from '../../../domain/entities/result/Result';
export interface RaceDetailOutputPort {
race: Race;
league: League | null;
registrations: RaceRegistration[];
drivers: Driver[];
userResult: Result | null;
isUserRegistered: boolean;
canRegister: boolean;
}

Some files were not shown because too many files have changed in this diff Show More