api client refactor

This commit is contained in:
2025-12-17 19:25:10 +01:00
parent 4177644b18
commit 26f7a2b6aa
27 changed files with 543 additions and 1329 deletions

View File

@@ -2,15 +2,42 @@ import { api as api } from '../../api';
import { presentDriversLeaderboard } from '../../presenters';
import { DriverLeaderboardViewModel } from '../../view-models';
/**
* Driver Service
*
* Handles driver-related operations including profiles, leaderboards, and onboarding.
*/
export class DriverService {
constructor(
private readonly apiClient = api.drivers
) {}
async getDriverLeaderboard(): Promise<DriverLeaderboardViewModel> {
const dto = await this.apiClient.getLeaderboard();
return presentDriversLeaderboard(dto);
}
async completeDriverOnboarding(input: any): Promise<any> {
return await this.apiClient.completeOnboarding(input);
}
async getCurrentDriver(): Promise<any> {
return await this.apiClient.getCurrent();
}
}
// Singleton instance
export const driverService = new DriverService();
// Backward compatibility functional exports
export async function getDriverLeaderboard(): Promise<DriverLeaderboardViewModel> {
const dto = await api.drivers.getLeaderboard();
return presentDriversLeaderboard(dto);
return driverService.getDriverLeaderboard();
}
export async function completeDriverOnboarding(input: any): Promise<any> {
return await api.drivers.completeOnboarding(input);
return driverService.completeDriverOnboarding(input);
}
export async function getCurrentDriver(): Promise<any> {
return await api.drivers.getCurrent();
return driverService.getCurrentDriver();
}

View File

@@ -0,0 +1,6 @@
// Export the class-based service
export { DriverService, driverService } from './DriverService';
// Export backward compatibility functions
export { getDriverLeaderboard, completeDriverOnboarding, getCurrentDriver } from './DriverService';
export { registerDriver, getDriverRegistrationStatus } from './DriverRegistrationService';

View File

@@ -1,23 +1,46 @@
import { api as api } from '../../api';
import { presentRaceResultsDetail } from '../../presenters';
import { RaceResultsDetailPresenter, RaceWithSOFPresenter, ImportRaceResultsPresenter } from '../../presenters';
import { RaceResultsDetailViewModel } from '../../view-models';
export class RaceResultsService {
constructor(
private readonly apiClient = api.races,
private readonly resultsDetailPresenter = new RaceResultsDetailPresenter(),
private readonly sofPresenter = new RaceWithSOFPresenter(),
private readonly importPresenter = new ImportRaceResultsPresenter()
) {}
async importRaceResults(raceId: string, input: any): Promise<any> {
const dto = await this.apiClient.importResults(raceId, input);
return this.importPresenter.present(dto);
}
async getResultsDetail(raceId: string, currentUserId?: string): Promise<RaceResultsDetailViewModel> {
const dto = await this.apiClient.getResultsDetail(raceId);
return this.resultsDetailPresenter.present(dto, currentUserId);
}
async getWithSOF(raceId: string): Promise<any> {
const dto = await this.apiClient.getWithSOF(raceId);
return this.sofPresenter.present(dto);
}
}
// Singleton instance
export const raceResultsService = new RaceResultsService();
// Backward compatibility functions
export async function getRaceResults(
raceId: string,
currentUserId?: string
): Promise<RaceResultsDetailViewModel> {
const dto = await api.races.getResultsDetail(raceId);
return presentRaceResultsDetail(dto, currentUserId);
return raceResultsService.getResultsDetail(raceId, currentUserId);
}
export async function getRaceSOF(raceId: string): Promise<any> {
const dto = await api.races.getWithSOF(raceId);
// TODO: use presenter
return dto;
return raceResultsService.getWithSOF(raceId);
}
export async function importRaceResults(raceId: string, input: any): Promise<any> {
const dto = await api.races.importResults(raceId, input);
// TODO: use presenter
return dto;
return raceResultsService.importRaceResults(raceId, input);
}

View File

@@ -1,22 +1,48 @@
import { api as api } from '../../api';
import { presentRaceDetail } from '../../presenters';
import { RaceDetailPresenter } from '../../presenters';
import { RaceDetailViewModel } from '../../view-models';
export class RaceService {
constructor(
private readonly apiClient = api.races,
private readonly presenter = new RaceDetailPresenter()
) {}
async getRaceDetail(
raceId: string,
driverId: string
): Promise<RaceDetailViewModel> {
const dto = await this.apiClient.getDetail(raceId, driverId);
return this.presenter.present(dto);
}
async getRacesPageData(): Promise<any> {
const dto = await this.apiClient.getPageData();
// TODO: use presenter
return dto;
}
async getRacesTotal(): Promise<any> {
const dto = await this.apiClient.getTotal();
return dto;
}
}
// Singleton instance
export const raceService = new RaceService();
// Backward compatibility functions
export async function getRaceDetail(
raceId: string,
driverId: string
): Promise<RaceDetailViewModel> {
const dto = await api.races.getDetail(raceId, driverId);
return presentRaceDetail(dto);
return raceService.getRaceDetail(raceId, driverId);
}
export async function getRacesPageData(): Promise<any> {
const dto = await api.races.getPageData();
// TODO: use presenter
return dto;
return raceService.getRacesPageData();
}
export async function getRacesTotal(): Promise<any> {
const dto = await api.races.getTotal();
return dto;
return raceService.getRacesTotal();
}

View File

@@ -0,0 +1,7 @@
// Export the class-based service
export { RaceService, raceService } from './RaceService';
export { RaceResultsService, raceResultsService } from './RaceResultsService';
// Export backward compatibility functions
export { getRaceDetail, getRacesPageData, getRacesTotal } from './RaceService';
export { getRaceResults, getRaceSOF, importRaceResults } from './RaceResultsService';