111 lines
2.7 KiB
TypeScript
111 lines
2.7 KiB
TypeScript
// types/racing.ts
|
|
// These match your PostgreSQL schema exactly
|
|
|
|
export type FlagType = 'NONE' | 'YELLOW' | 'BLUE' | 'BLACK' | 'CHECKERED';
|
|
|
|
export interface Server {
|
|
server_id: number;
|
|
session_type: number;
|
|
session_flag: FlagType;
|
|
session_count: number;
|
|
server_name: string;
|
|
server_track: string;
|
|
server_config: string;
|
|
server_weather_graphics: string | null;
|
|
typ: number | null;
|
|
session_time: number;
|
|
session_laps: number;
|
|
session_wait_time: number;
|
|
session_ambient_temp: number;
|
|
session_road_temp: number;
|
|
session_elapsed_time: number;
|
|
connected_players: number;
|
|
created_at: Date;
|
|
updated_at: Date;
|
|
}
|
|
|
|
export interface Driver {
|
|
driver_guid: number;
|
|
driver_name: string;
|
|
driver_team: string | null;
|
|
car_model: string | null;
|
|
car_skin: string | null;
|
|
cuts_alltime: number;
|
|
contacts_alltime: number;
|
|
laps_completed: number;
|
|
user_rank: number;
|
|
is_connect: boolean;
|
|
is_loading: boolean;
|
|
current_server: number | null;
|
|
created_at: Date;
|
|
}
|
|
|
|
// Helpful joined type for displaying drivers with their server info
|
|
export interface DriverWithServer extends Driver {
|
|
server?: Partial<Server>; // Make it partial since we don't always need all fields
|
|
}
|
|
|
|
// For live tracking (you mentioned getting positions from parser)
|
|
export interface LivePosition {
|
|
driver_guid: number;
|
|
driver_name: string;
|
|
position: number;
|
|
lap: number;
|
|
last_lap_time?: number;
|
|
best_lap_time?: number;
|
|
car_model: string;
|
|
// Add whatever else your parser sends
|
|
}
|
|
|
|
// API Response wrappers
|
|
export interface ApiResponse<T> {
|
|
success: boolean;
|
|
data?: T;
|
|
error?: string;
|
|
}
|
|
|
|
export interface DashboardStats {
|
|
total_drivers_online: number;
|
|
active_servers: number;
|
|
total_laps_today: number;
|
|
fastest_lap_today?: {
|
|
driver_name: string;
|
|
lap_time: number;
|
|
track: string;
|
|
};
|
|
}
|
|
|
|
// Events types
|
|
export interface Event {
|
|
event_id: number;
|
|
event_name: string;
|
|
event_description: string | null;
|
|
event_track: string;
|
|
event_date: Date;
|
|
event_duration: number | null;
|
|
max_participants: number;
|
|
registration_deadline: Date | null;
|
|
event_status: 'OPEN' | 'CLOSED' | 'COMPLETED' | 'CANCELLED';
|
|
event_banner_url: string | null;
|
|
event_rules: string | null;
|
|
created_at: Date;
|
|
updated_at: Date;
|
|
}
|
|
|
|
export interface EventRegistration {
|
|
registration_id: number;
|
|
event_id: number;
|
|
driver_guid: number; // Changed from string to number (BIGINT)
|
|
car_model: string;
|
|
car_skin: string | null;
|
|
team_name: string | null;
|
|
registration_date: Date;
|
|
status: 'REGISTERED' | 'CONFIRMED' | 'CANCELLED';
|
|
notes: string | null;
|
|
}
|
|
|
|
export interface EventWithRegistrations extends Event {
|
|
registrations_count: number;
|
|
user_registered?: boolean;
|
|
}
|