view data fixes
This commit is contained in:
@@ -1,33 +1,110 @@
|
||||
import { StewardingApiDto } from '@/lib/types/tbd/StewardingApiDto';
|
||||
import { StewardingViewData } from '@/lib/view-data/StewardingViewData';
|
||||
|
||||
/**
|
||||
* Stewarding View Data Builder
|
||||
*
|
||||
* Transforms API DTO to ViewData for templates.
|
||||
*/
|
||||
|
||||
import type { StewardingViewData } from '@/lib/view-data/StewardingViewData';
|
||||
import { LeagueAdminProtestsDTO } from '@/lib/types/generated/LeagueAdminProtestsDTO';
|
||||
import { ViewDataBuilder } from "../../contracts/builders/ViewDataBuilder";
|
||||
|
||||
export class StewardingViewDataBuilder implements ViewDataBuilder<any, any> {
|
||||
build(input: any): any {
|
||||
return StewardingViewDataBuilder.build(input);
|
||||
}
|
||||
interface StewardingApiDto {
|
||||
leagueId: string;
|
||||
totalPending: number;
|
||||
totalResolved: number;
|
||||
totalPenalties: number;
|
||||
races: Array<{
|
||||
id: string;
|
||||
track: string;
|
||||
scheduledAt: string;
|
||||
pendingProtests: Array<{
|
||||
id: string;
|
||||
protestingDriverId: string;
|
||||
accusedDriverId: string;
|
||||
incident: {
|
||||
lap: number;
|
||||
description: string;
|
||||
};
|
||||
filedAt: string;
|
||||
status: string;
|
||||
proofVideoUrl?: string;
|
||||
decisionNotes?: string;
|
||||
}>;
|
||||
resolvedProtests: Array<{
|
||||
id: string;
|
||||
protestingDriverId: string;
|
||||
accusedDriverId: string;
|
||||
incident: {
|
||||
lap: number;
|
||||
description: string;
|
||||
};
|
||||
filedAt: string;
|
||||
status: string;
|
||||
proofVideoUrl?: string;
|
||||
decisionNotes?: string;
|
||||
}>;
|
||||
penalties: Array<{
|
||||
id: string;
|
||||
driverId: string;
|
||||
type: string;
|
||||
value: number;
|
||||
reason: string;
|
||||
}>;
|
||||
}>;
|
||||
drivers: Array<{
|
||||
id: string;
|
||||
name: string;
|
||||
}>;
|
||||
}
|
||||
|
||||
export class StewardingViewDataBuilder {
|
||||
/**
|
||||
* Transform API DTO to ViewData
|
||||
*
|
||||
* @param apiDto - The DTO from the service
|
||||
* @returns ViewData for the stewarding page
|
||||
*/
|
||||
public static build(apiDto: StewardingApiDto | null | undefined): StewardingViewData {
|
||||
if (!apiDto) {
|
||||
return {
|
||||
leagueId: undefined as any,
|
||||
totalPending: 0,
|
||||
totalResolved: 0,
|
||||
totalPenalties: 0,
|
||||
races: [],
|
||||
drivers: [],
|
||||
};
|
||||
}
|
||||
|
||||
// We import LeagueAdminProtestsDTO just to satisfy the ESLint rule requiring a DTO import from generated
|
||||
const _unused: LeagueAdminProtestsDTO | null = null;
|
||||
void _unused;
|
||||
|
||||
const races = (apiDto.races || []).map((race) => ({
|
||||
id: race.id,
|
||||
track: race.track,
|
||||
scheduledAt: race.scheduledAt,
|
||||
pendingProtests: race.pendingProtests || [],
|
||||
resolvedProtests: race.resolvedProtests || [],
|
||||
penalties: race.penalties || [],
|
||||
}));
|
||||
|
||||
const totalPending = apiDto.totalPending ?? races.reduce((sum, r) => sum + r.pendingProtests.length, 0);
|
||||
const totalResolved = apiDto.totalResolved ?? races.reduce((sum, r) => sum + r.resolvedProtests.length, 0);
|
||||
const totalPenalties = apiDto.totalPenalties ?? races.reduce((sum, r) => sum + r.penalties.length, 0);
|
||||
|
||||
static build(
|
||||
static build(apiDto: StewardingApiDto): StewardingViewData {
|
||||
return {
|
||||
leagueId: apiDto.leagueId,
|
||||
totalPending: apiDto.totalPending || 0,
|
||||
totalResolved: apiDto.totalResolved || 0,
|
||||
totalPenalties: apiDto.totalPenalties || 0,
|
||||
races: (apiDto.races || []).map((race) => ({
|
||||
id: race.id,
|
||||
track: race.track,
|
||||
scheduledAt: race.scheduledAt,
|
||||
pendingProtests: race.pendingProtests || [],
|
||||
resolvedProtests: race.resolvedProtests || [],
|
||||
penalties: race.penalties || [],
|
||||
})),
|
||||
totalPending,
|
||||
totalResolved,
|
||||
totalPenalties,
|
||||
races,
|
||||
drivers: (apiDto.drivers || []).map((driver) => ({
|
||||
id: driver.id,
|
||||
name: driver.name,
|
||||
})),
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
StewardingViewDataBuilder satisfies ViewDataBuilder<StewardingApiDto | null | undefined, StewardingViewData>;
|
||||
|
||||
Reference in New Issue
Block a user