website refactor

This commit is contained in:
2026-01-21 01:56:07 +01:00
parent 977dcc4e86
commit c06f93f1b6
22 changed files with 576 additions and 487 deletions

View File

@@ -18,6 +18,9 @@ import type { LeagueSeasonSchedulePublishOutputDTO } from '@/lib/types/generated
import type { LeagueRosterMemberDTO } from '@/lib/types/generated/LeagueRosterMemberDTO';
import type { LeagueMembershipsDTO } from '@/lib/types/generated/LeagueMembershipsDTO';
import type { GetTeamDetailsOutputDTO } from '@/lib/types/generated/GetTeamDetailsOutputDTO';
import type { GetDriverOutputDTO } from '@/lib/types/generated/GetDriverOutputDTO';
import type { RaceDTO } from '@/lib/types/generated/RaceDTO';
import type { LeagueScoringConfigDTO } from '@/lib/types/generated/LeagueScoringConfigDTO';
import { TeamMemberViewModel } from '@/lib/view-models/TeamMemberViewModel';
import { TeamSummaryViewModel } from '@/lib/view-models/TeamSummaryViewModel';
import { TeamDetailsViewModel } from '@/lib/view-models/TeamDetailsViewModel';
@@ -45,7 +48,11 @@ export interface LeagueRosterAdminData {
export interface LeagueDetailData {
league: LeagueWithCapacityAndScoringDTO;
apiDto: AllLeaguesWithCapacityAndScoringDTO;
owner: GetDriverOutputDTO | null;
scoringConfig: LeagueScoringConfigDTO | null;
memberships: LeagueMembershipsDTO;
races: RaceDTO[];
sponsors: any[];
}
/**
@@ -58,24 +65,28 @@ export interface LeagueDetailData {
@injectable()
export class LeagueService implements Service {
private apiClient: LeaguesApiClient;
private driversApiClient?: DriversApiClient;
private sponsorsApiClient?: SponsorsApiClient;
private racesApiClient?: RacesApiClient;
private driversApiClient: DriversApiClient;
private sponsorsApiClient: SponsorsApiClient;
private racesApiClient: RacesApiClient;
constructor(@unmanaged() apiClient?: LeaguesApiClient) {
const baseUrl = getWebsiteApiBaseUrl();
const logger = new ConsoleLogger();
const errorReporter = new EnhancedErrorReporter(logger, {
showUserNotifications: false,
logToConsole: true,
reportToExternal: isProductionEnvironment(),
});
if (apiClient) {
this.apiClient = apiClient;
} else {
const baseUrl = getWebsiteApiBaseUrl();
const logger = new ConsoleLogger();
const errorReporter = new EnhancedErrorReporter(logger, {
showUserNotifications: false,
logToConsole: true,
reportToExternal: isProductionEnvironment(),
});
this.apiClient = new LeaguesApiClient(baseUrl, errorReporter, logger);
}
// Optional clients can be initialized if needed
this.driversApiClient = new DriversApiClient(baseUrl, errorReporter, logger);
this.sponsorsApiClient = new SponsorsApiClient(baseUrl, errorReporter, logger);
this.racesApiClient = new RacesApiClient(baseUrl, errorReporter, logger);
}
async getLeagueStandings(leagueId: string): Promise<any> {
@@ -143,7 +154,11 @@ export class LeagueService implements Service {
async getLeagueDetailData(leagueId: string): Promise<Result<LeagueDetailData, DomainError>> {
try {
const apiDto = await this.apiClient.getAllWithCapacityAndScoring();
const [apiDto, memberships, racesResponse] = await Promise.all([
this.apiClient.getAllWithCapacityAndScoring(),
this.apiClient.getMemberships(leagueId),
this.apiClient.getRaces(leagueId),
]);
if (!apiDto || !apiDto.leagues) {
return Result.err({ type: 'notFound', message: 'Leagues not found' });
@@ -153,10 +168,40 @@ export class LeagueService implements Service {
if (!league) {
return Result.err({ type: 'notFound', message: 'League not found' });
}
// Fetch owner if ownerId exists
let owner: GetDriverOutputDTO | null = null;
if (league.ownerId) {
owner = await this.driversApiClient.getDriver(league.ownerId);
}
// Fetch scoring config if available
let scoringConfig: LeagueScoringConfigDTO | null = null;
try {
const config = await this.apiClient.getLeagueConfig(leagueId);
if (config.form?.scoring) {
// Map form scoring to LeagueScoringConfigDTO if possible, or just use partial
scoringConfig = {
leagueId,
seasonId: '', // Not available in this context
gameId: '',
gameName: '',
scoringPresetId: (config.form.scoring as any).presetId,
dropPolicySummary: '',
championships: [],
};
}
} catch (e) {
console.warn('Failed to fetch league scoring config', e);
}
return Result.ok({
league,
apiDto,
owner,
scoringConfig,
memberships,
races: racesResponse.races,
sponsors: [], // Sponsors integration can be added here
});
} catch (error: unknown) {
console.error('LeagueService.getLeagueDetailData failed:', error);