Files
gridpilot.gg/apps/website/lib/services/leagues/LeagueScheduleService.ts
Marc Mintel 6c07abe5e7
Some checks failed
Contract Testing / contract-snapshot (pull_request) Has been cancelled
Contract Testing / contract-tests (pull_request) Has been cancelled
view data fixes
2026-01-25 00:12:30 +01:00

48 lines
1.7 KiB
TypeScript

import { getWebsiteApiBaseUrl } from '@/lib/config/apiBaseUrl';
import { Result } from '@/lib/contracts/Result';
import { DomainError, Service } from '@/lib/contracts/services/Service';
import { LeaguesApiClient } from '@/lib/gateways/api/leagues/LeaguesApiClient';
import { ConsoleErrorReporter } from '@/lib/infrastructure/logging/ConsoleErrorReporter';
import { ConsoleLogger } from '@/lib/infrastructure/logging/ConsoleLogger';
import { LeagueScheduleApiDto } from '@/lib/types/tbd/LeagueScheduleApiDto';
export class LeagueScheduleService implements Service {
private apiClient: LeaguesApiClient;
constructor() {
const baseUrl = getWebsiteApiBaseUrl();
this.apiClient = new LeaguesApiClient(
baseUrl,
new ConsoleErrorReporter(),
new ConsoleLogger()
);
}
async getScheduleData(leagueId: string): Promise<Result<LeagueScheduleApiDto, DomainError>> {
try {
const data = await this.apiClient.getSchedule(leagueId);
// Map LeagueScheduleDTO to LeagueScheduleApiDto
const apiDto: LeagueScheduleApiDto = {
leagueId,
seasonId: data.seasonId || '',
published: data.published || false,
races: data.races.map(race => ({
id: race.id,
name: race.name,
date: race.date,
track: (race as any).track || 'TBA',
car: (race as any).car || 'TBA',
sessionType: (race as any).sessionType || 'Race',
status: (race as any).status || 'scheduled',
strengthOfField: (race as any).strengthOfField,
})),
};
return Result.ok(apiDto);
} catch (error: unknown) {
return Result.err({ type: 'serverError', message: (error as Error).message || 'Failed to fetch schedule' });
}
}
}