league service

This commit is contained in:
2025-12-16 00:57:31 +01:00
parent 3b566c973d
commit 775d41e055
130 changed files with 4077 additions and 1036 deletions

View File

@@ -0,0 +1,13 @@
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface ApproveLeagueJoinRequestViewModel {
success: boolean;
message: string;
}
export interface ApproveLeagueJoinRequestResultDTO {
success: boolean;
message: string;
}
export interface IApproveLeagueJoinRequestPresenter extends Presenter<ApproveLeagueJoinRequestResultDTO, ApproveLeagueJoinRequestViewModel> {}

View File

@@ -0,0 +1,17 @@
export interface CompleteDriverOnboardingViewModel {
success: boolean;
driverId?: string;
errorMessage?: string;
}
export interface CompleteDriverOnboardingResultDTO {
success: boolean;
driverId?: string;
errorMessage?: string;
}
export interface ICompleteDriverOnboardingPresenter {
present(dto: CompleteDriverOnboardingResultDTO): void;
get viewModel(): CompleteDriverOnboardingViewModel;
reset(): void;
}

View File

@@ -0,0 +1,13 @@
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface GetLeagueAdminPermissionsViewModel {
canRemoveMember: boolean;
canUpdateRoles: boolean;
}
export interface GetLeagueAdminPermissionsResultDTO {
canRemoveMember: boolean;
canUpdateRoles: boolean;
}
export interface IGetLeagueAdminPermissionsPresenter extends Presenter<GetLeagueAdminPermissionsResultDTO, GetLeagueAdminPermissionsViewModel> {}

View File

@@ -0,0 +1,13 @@
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface LeagueAdminViewModel {
leagueId: string;
ownerId: string;
}
export interface GetLeagueAdminResultDTO {
leagueId: string;
ownerId: string;
}
export interface IGetLeagueAdminPresenter extends Presenter<GetLeagueAdminResultDTO, LeagueAdminViewModel> {}

View File

@@ -0,0 +1,21 @@
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface LeagueJoinRequestViewModel {
id: string;
leagueId: string;
driverId: string;
requestedAt: Date;
message: string;
driver: { id: string; name: string } | null;
}
export interface GetLeagueJoinRequestsViewModel {
joinRequests: LeagueJoinRequestViewModel[];
}
export interface GetLeagueJoinRequestsResultDTO {
joinRequests: any[];
drivers: { id: string; name: string }[];
}
export interface IGetLeagueJoinRequestsPresenter extends Presenter<GetLeagueJoinRequestsResultDTO, GetLeagueJoinRequestsViewModel> {}

View File

@@ -0,0 +1,21 @@
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface LeagueMembershipsViewModel {
members: {
driverId: string;
driver: { id: string; name: string };
role: string;
joinedAt: Date;
}[];
}
export interface GetLeagueMembershipsViewModel {
memberships: LeagueMembershipsViewModel;
}
export interface GetLeagueMembershipsResultDTO {
memberships: any[];
drivers: { id: string; name: string }[];
}
export interface IGetLeagueMembershipsPresenter extends Presenter<GetLeagueMembershipsResultDTO, GetLeagueMembershipsViewModel> {}

View File

@@ -0,0 +1,17 @@
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface LeagueOwnerSummaryViewModel {
driver: { id: string; name: string };
rating: number;
rank: number;
}
export interface GetLeagueOwnerSummaryViewModel {
summary: LeagueOwnerSummaryViewModel | null;
}
export interface GetLeagueOwnerSummaryResultDTO {
summary: LeagueOwnerSummaryViewModel | null;
}
export interface IGetLeagueOwnerSummaryPresenter extends Presenter<GetLeagueOwnerSummaryResultDTO, GetLeagueOwnerSummaryViewModel> {}

View File

@@ -0,0 +1,15 @@
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface GetLeagueProtestsViewModel {
protests: any[];
racesById: Record<string, any>;
driversById: Record<string, any>;
}
export interface GetLeagueProtestsResultDTO {
protests: any[];
races: any[];
drivers: { id: string; name: string }[];
}
export interface IGetLeagueProtestsPresenter extends Presenter<GetLeagueProtestsResultDTO, GetLeagueProtestsViewModel> {}

View File

@@ -0,0 +1,19 @@
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface LeagueScheduleViewModel {
races: Array<{
id: string;
name: string;
date: string;
}>;
}
export interface GetLeagueScheduleResultDTO {
races: Array<{
id: string;
name: string;
scheduledAt: Date;
}>;
}
export interface IGetLeagueSchedulePresenter extends Presenter<GetLeagueScheduleResultDTO, LeagueScheduleViewModel> {}

View File

@@ -0,0 +1,21 @@
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface LeagueSeasonSummaryViewModel {
seasonId: string;
name: string;
status: string;
startDate: Date;
endDate: Date;
isPrimary: boolean;
isParallelActive: boolean;
}
export interface GetLeagueSeasonsViewModel {
seasons: LeagueSeasonSummaryViewModel[];
}
export interface GetLeagueSeasonsResultDTO {
seasons: any[];
}
export interface IGetLeagueSeasonsPresenter extends Presenter<GetLeagueSeasonsResultDTO, GetLeagueSeasonsViewModel> {}

View File

@@ -0,0 +1,11 @@
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface GetTotalLeaguesViewModel {
totalLeagues: number;
}
export interface GetTotalLeaguesResultDTO {
totalLeagues: number;
}
export interface IGetTotalLeaguesPresenter extends Presenter<GetTotalLeaguesResultDTO, GetTotalLeaguesViewModel> {}

View File

@@ -2,24 +2,19 @@ import type { Standing } from '../../domain/entities/Standing';
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface StandingItemViewModel {
id: string;
leagueId: string;
seasonId: string;
driverId: string;
position: number;
driver: { id: string; name: string };
points: number;
wins: number;
podiums: number;
racesCompleted: number;
rank: number;
}
export interface LeagueStandingsViewModel {
leagueId: string;
standings: StandingItemViewModel[];
}
export interface LeagueStandingsResultDTO {
standings: Standing[];
drivers: { id: string; name: string }[];
}
export interface ILeagueStandingsPresenter

View File

@@ -1,20 +1,16 @@
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface LeagueStatsViewModel {
leagueId: string;
totalMembers: number;
totalRaces: number;
completedRaces: number;
scheduledRaces: number;
averageSOF: number | null;
highestSOF: number | null;
lowestSOF: number | null;
averageRating: number;
}
export interface ILeagueStatsPresenter {
present(
leagueId: string,
totalRaces: number,
completedRaces: number,
scheduledRaces: number,
sofValues: number[]
): LeagueStatsViewModel;
getViewModel(): LeagueStatsViewModel;
}
export interface LeagueStatsResultDTO {
totalMembers: number;
totalRaces: number;
averageRating: number;
}
export interface ILeagueStatsPresenter
extends Presenter<LeagueStatsResultDTO, LeagueStatsViewModel> {}

View File

@@ -0,0 +1,13 @@
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface RejectLeagueJoinRequestViewModel {
success: boolean;
message: string;
}
export interface RejectLeagueJoinRequestResultDTO {
success: boolean;
message: string;
}
export interface IRejectLeagueJoinRequestPresenter extends Presenter<RejectLeagueJoinRequestResultDTO, RejectLeagueJoinRequestViewModel> {}

View File

@@ -0,0 +1,11 @@
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface RemoveLeagueMemberViewModel {
success: boolean;
}
export interface RemoveLeagueMemberResultDTO {
success: boolean;
}
export interface IRemoveLeagueMemberPresenter extends Presenter<RemoveLeagueMemberResultDTO, RemoveLeagueMemberViewModel> {}

View File

@@ -0,0 +1,13 @@
export interface TotalDriversViewModel {
totalDrivers: number;
}
export interface TotalDriversResultDTO {
totalDrivers: number;
}
export interface ITotalDriversPresenter {
present(dto: TotalDriversResultDTO): void;
get viewModel(): TotalDriversViewModel;
reset(): void;
}

View File

@@ -0,0 +1,11 @@
import type { Presenter } from '@gridpilot/shared/presentation/Presenter';
export interface UpdateLeagueMemberRoleViewModel {
success: boolean;
}
export interface UpdateLeagueMemberRoleResultDTO {
success: boolean;
}
export interface IUpdateLeagueMemberRolePresenter extends Presenter<UpdateLeagueMemberRoleResultDTO, UpdateLeagueMemberRoleViewModel> {}