import { BaseApiClient } from '../base/BaseApiClient'; import type { RaceStatsDTO } from '../../types/generated/RaceStatsDTO'; import type { RacesPageDataRaceDTO } from '../../types/generated/RacesPageDataRaceDTO'; import type { RaceResultsDetailDTO } from '../../types/generated/RaceResultsDetailDTO'; import type { RaceWithSOFDTO } from '../../types/generated/RaceWithSOFDTO'; import type { RegisterForRaceParamsDTO } from '../../types/generated/RegisterForRaceParamsDTO'; import type { ImportRaceResultsDTO } from '../../types/generated/ImportRaceResultsDTO'; import type { WithdrawFromRaceParamsDTO } from '../../types/generated/WithdrawFromRaceParamsDTO'; import type { RaceDetailRaceDTO } from '../../types/generated/RaceDetailRaceDTO'; import type { RaceDetailLeagueDTO } from '../../types/generated/RaceDetailLeagueDTO'; import type { RaceDetailEntryDTO } from '../../types/generated/RaceDetailEntryDTO'; import type { RaceDetailRegistrationDTO } from '../../types/generated/RaceDetailRegistrationDTO'; import type { RaceDetailUserResultDTO } from '../../types/generated/RaceDetailUserResultDTO'; import type { FileProtestCommandDTO } from '../../types/generated/FileProtestCommandDTO'; // Define missing types export type RacesPageDataDTO = { races: RacesPageDataRaceDTO[] }; export type RaceDetailDTO = { race: RaceDetailRaceDTO | null; league: RaceDetailLeagueDTO | null; entryList: RaceDetailEntryDTO[]; registration: RaceDetailRegistrationDTO; userResult: RaceDetailUserResultDTO | null; error?: string; }; export type ImportRaceResultsSummaryDTO = { success: boolean; raceId: string; driversProcessed: number; resultsRecorded: number; errors?: string[]; }; /** * Races API Client * * Handles all race-related API operations. */ export class RacesApiClient extends BaseApiClient { /** Get total number of races */ getTotal(): Promise { return this.get('/races/total-races'); } /** Get races page data */ getPageData(leagueId?: string): Promise { const query = leagueId ? `?leagueId=${encodeURIComponent(leagueId)}` : ''; return this.get(`/races/page-data${query}`); } /** Get race detail */ getDetail(raceId: string, driverId: string): Promise { return this.get(`/races/${raceId}?driverId=${driverId}`); } /** Get race results detail */ getResultsDetail(raceId: string): Promise { return this.get(`/races/${raceId}/results`); } /** Get race with strength of field */ getWithSOF(raceId: string): Promise { return this.get(`/races/${raceId}/sof`); } /** Register for race */ register(raceId: string, input: RegisterForRaceParamsDTO): Promise { return this.post(`/races/${raceId}/register`, input); } /** Import race results */ importResults(raceId: string, input: ImportRaceResultsDTO): Promise { return this.post(`/races/${raceId}/import-results`, input); } /** Withdraw from race */ withdraw(raceId: string, input: WithdrawFromRaceParamsDTO): Promise { return this.post(`/races/${raceId}/withdraw`, input); } /** Cancel race */ cancel(raceId: string): Promise { return this.post(`/races/${raceId}/cancel`, {}); } /** Complete race */ complete(raceId: string): Promise { return this.post(`/races/${raceId}/complete`, {}); } /** Re-open race */ reopen(raceId: string): Promise { return this.post(`/races/${raceId}/reopen`, {}); } /** File a protest */ fileProtest(input: FileProtestCommandDTO): Promise { return this.post('/races/protests/file', input); } }