70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
// app/api/dashboard/route.ts
|
|
// API endpoint for dashboard data
|
|
|
|
import { query } from '@/lib/db';
|
|
import { NextResponse } from 'next/server';
|
|
|
|
export const dynamic = 'force-dynamic';
|
|
|
|
export async function GET() {
|
|
try {
|
|
const sql = `
|
|
SELECT
|
|
u.driver_guid,
|
|
u.driver_name,
|
|
u.driver_team,
|
|
u.car_model,
|
|
u.car_skin,
|
|
u.user_rank,
|
|
u.laps_completed,
|
|
s.server_id,
|
|
s.server_name,
|
|
s.server_track,
|
|
s.server_config,
|
|
s.session_type,
|
|
s.session_flag,
|
|
s.session_time,
|
|
s.session_laps,
|
|
s.session_elapsed_time,
|
|
s.session_ambient_temp,
|
|
s.session_road_temp,
|
|
s.connected_players
|
|
FROM users u
|
|
INNER JOIN servers s ON u.current_server = s.server_id
|
|
WHERE u.is_connect = true
|
|
ORDER BY s.server_id, u.user_rank ASC
|
|
`;
|
|
|
|
const rows = await query(sql);
|
|
|
|
const drivers = rows.map((row: any) => ({
|
|
driver_guid: row.driver_guid,
|
|
driver_name: row.driver_name,
|
|
driver_team: row.driver_team,
|
|
car_model: row.car_model,
|
|
car_skin: row.car_skin,
|
|
laps_completed: row.laps_completed,
|
|
user_rank: row.user_rank,
|
|
server: {
|
|
server_id: row.server_id,
|
|
server_name: row.server_name,
|
|
server_track: row.server_track,
|
|
server_config: row.server_config,
|
|
session_type: row.session_type,
|
|
session_flag: row.session_flag,
|
|
session_time: row.session_time,
|
|
session_laps: row.session_laps,
|
|
session_elapsed_time: row.session_elapsed_time,
|
|
session_ambient_temp: row.session_ambient_temp,
|
|
session_road_temp: row.session_road_temp,
|
|
connected_players: row.connected_players,
|
|
},
|
|
}));
|
|
|
|
return NextResponse.json({ drivers });
|
|
} catch (error) {
|
|
console.error('[Dashboard API] Error:', error);
|
|
return NextResponse.json({ error: 'Failed to fetch dashboard data' }, { status: 500 });
|
|
}
|
|
}
|