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;
}