Files
gridpilot.gg/apps/website/lib/services/leagues/LeagueStandingsService.ts
2026-01-24 12:47:49 +01:00

72 lines
2.5 KiB
TypeScript

import { getWebsiteApiBaseUrl } from '@/lib/config/apiBaseUrl';
import { Result } from '@/lib/contracts/Result';
import { Service, type DomainError } 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 { type LeagueMembershipsApiDto, type LeagueStandingsApiDto } from '@/lib/types/tbd/LeagueStandingsApiDto';
export class LeagueStandingsService implements Service {
private apiClient: LeaguesApiClient;
constructor() {
const baseUrl = getWebsiteApiBaseUrl();
this.apiClient = new LeaguesApiClient(
baseUrl,
new ConsoleErrorReporter(),
new ConsoleLogger()
);
}
async getStandingsData(leagueId: string): Promise<Result<{ standings: LeagueStandingsApiDto; memberships: LeagueMembershipsApiDto }, DomainError>> {
try {
const [standingsData, membershipsData] = await Promise.all([
this.apiClient.getStandings(leagueId),
this.apiClient.getMemberships(leagueId),
]);
// Map LeagueStandingsDTO to LeagueStandingsApiDto
const standings: LeagueStandingsApiDto = {
standings: standingsData.standings.map(s => ({
driverId: s.driverId,
driver: {
id: s.driver.id,
name: s.driver.name,
iracingId: s.driver.iracingId,
country: s.driver.country,
joinedAt: s.driver.joinedAt,
},
points: s.points,
position: s.position,
wins: s.wins,
podiums: s.podiums,
races: s.races,
positionChange: s.positionChange,
lastRacePoints: s.lastRacePoints,
droppedRaceIds: s.droppedRaceIds,
})),
};
// Map LeagueMembershipsDTO to LeagueMembershipsApiDto
const memberships: LeagueMembershipsApiDto = {
members: (membershipsData.members || []).map(m => ({
driverId: m.driverId,
driver: {
id: m.driver.id,
name: m.driver.name,
iracingId: m.driver.iracingId,
country: m.driver.country,
joinedAt: m.driver.joinedAt,
},
role: m.role as any,
joinedAt: m.joinedAt,
})),
};
return Result.ok({ standings, memberships });
} catch (error: unknown) {
return Result.err({ type: 'serverError', message: (error as Error).message || 'Failed to fetch standings' });
}
}
}