fix: updated from 9.3.3 to 15
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
import { query } from '@/lib/db';
|
import { query } from '@/lib/db';
|
||||||
import { NextResponse } from 'next/server';
|
import { NextResponse } from 'next/server';
|
||||||
|
import { DriverServerRow } from '@/types/racing';
|
||||||
|
|
||||||
export const dynamic = 'force-dynamic';
|
export const dynamic = 'force-dynamic';
|
||||||
|
|
||||||
@@ -35,9 +36,9 @@ export async function GET() {
|
|||||||
ORDER BY s.server_id, u.user_rank ASC
|
ORDER BY s.server_id, u.user_rank ASC
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const rows = await query(sql);
|
const rows = await query<DriverServerRow>(sql);
|
||||||
|
|
||||||
const drivers = rows.map((row: unknown) => ({
|
const drivers = rows.map((row) => ({
|
||||||
driver_guid: row.driver_guid,
|
driver_guid: row.driver_guid,
|
||||||
driver_name: row.driver_name,
|
driver_name: row.driver_name,
|
||||||
driver_team: row.driver_team,
|
driver_team: row.driver_team,
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
import { NextResponse } from 'next/server';
|
import { NextResponse } from 'next/server';
|
||||||
import { query } from '@/lib/db';
|
import { query } from '@/lib/db';
|
||||||
import { DriverWithServer } from '@/types/racing';
|
import { DriverServerRow } from '@/types/racing';
|
||||||
|
|
||||||
export async function GET(request: Request) {
|
export async function GET(request: Request) {
|
||||||
try {
|
try {
|
||||||
@@ -40,10 +40,10 @@ export async function GET(request: Request) {
|
|||||||
ORDER BY u.user_rank ASC
|
ORDER BY u.user_rank ASC
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const rows = await query(sql);
|
const rows = await query<DriverServerRow>(sql);
|
||||||
|
|
||||||
// Transform to proper structure
|
// Transform to proper structure
|
||||||
const drivers: DriverWithServer[] = rows.map((row: unkown) => ({
|
const drivers = rows.map((row) => ({
|
||||||
driver_guid: row.driver_guid,
|
driver_guid: row.driver_guid,
|
||||||
driver_name: row.driver_name,
|
driver_name: row.driver_name,
|
||||||
driver_team: row.driver_team,
|
driver_team: row.driver_team,
|
||||||
@@ -57,7 +57,6 @@ export async function GET(request: Request) {
|
|||||||
is_loading: row.is_loading,
|
is_loading: row.is_loading,
|
||||||
current_server: row.current_server,
|
current_server: row.current_server,
|
||||||
created_at: row.created_at,
|
created_at: row.created_at,
|
||||||
// Include server info if they're connected
|
|
||||||
server: row.server_id ? {
|
server: row.server_id ? {
|
||||||
server_id: row.server_id,
|
server_id: row.server_id,
|
||||||
server_name: row.server_name,
|
server_name: row.server_name,
|
||||||
@@ -65,7 +64,7 @@ export async function GET(request: Request) {
|
|||||||
session_type: row.session_type,
|
session_type: row.session_type,
|
||||||
session_flag: row.session_flag,
|
session_flag: row.session_flag,
|
||||||
connected_players: row.connected_players,
|
connected_players: row.connected_players,
|
||||||
} : undefined,
|
} : null, // Handle case where driver is not connected to a server
|
||||||
}));
|
}));
|
||||||
|
|
||||||
return NextResponse.json({
|
return NextResponse.json({
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
import { NextResponse } from 'next/server';
|
import { NextResponse } from 'next/server';
|
||||||
import { query, queryOne } from '@/lib/db';
|
import { query, queryOne } from '@/lib/db';
|
||||||
|
import { EventCheckRow } from '@/types/racing';
|
||||||
|
|
||||||
export async function POST(request: Request) {
|
export async function POST(request: Request) {
|
||||||
try {
|
try {
|
||||||
@@ -51,7 +52,9 @@ export async function POST(request: Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if event exists and is open
|
// Check if event exists and is open
|
||||||
const eventCheck: unknown = await queryOne(
|
|
||||||
|
|
||||||
|
const eventCheck = await queryOne<EventCheckRow>(
|
||||||
`SELECT event_id, event_status, max_participants,
|
`SELECT event_id, event_status, max_participants,
|
||||||
(SELECT COUNT(*) FROM event_registrations
|
(SELECT COUNT(*) FROM event_registrations
|
||||||
WHERE event_id = $1 AND status = 'REGISTERED') as current_registrations
|
WHERE event_id = $1 AND status = 'REGISTERED') as current_registrations
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
import { getTelemetryBridge } from '@/lib/telemetryBridge';
|
import { getTelemetryBridge } from '@/lib/telemetryBridge';
|
||||||
import { query } from '@/lib/db';
|
import { query } from '@/lib/db';
|
||||||
|
import { RankRow } from '@/types/racing';
|
||||||
|
|
||||||
export const dynamic = 'force-dynamic';
|
export const dynamic = 'force-dynamic';
|
||||||
export const runtime = 'nodejs';
|
export const runtime = 'nodejs';
|
||||||
@@ -20,20 +21,20 @@ async function updateRankCache() {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// Get all users sorted by rank (higher is better)
|
// Get all users sorted by rank (higher is better)
|
||||||
const users = await query(
|
const users = await query<RankRow>(`
|
||||||
`SELECT
|
SELECT
|
||||||
driver_guid,
|
driver_guid,
|
||||||
user_rank,
|
user_rank,
|
||||||
ROW_NUMBER() OVER (ORDER BY user_rank DESC) as rank_position
|
ROW_NUMBER() OVER (ORDER BY user_rank DESC) as rank_position
|
||||||
FROM users
|
FROM users
|
||||||
WHERE user_rank IS NOT NULL
|
WHERE user_rank IS NOT NULL
|
||||||
ORDER BY user_rank DESC`
|
ORDER BY user_rank DESC
|
||||||
);
|
`);
|
||||||
|
|
||||||
rankCache.clear();
|
rankCache.clear();
|
||||||
users.forEach((row: unknown) => {
|
users.forEach((row) => {
|
||||||
rankCache.set(row.driver_guid.toString(), {
|
rankCache.set(String(row.driver_guid), {
|
||||||
rank: row.rank_position,
|
rank: row.user_position,
|
||||||
rating: row.user_rank
|
rating: row.user_rank
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
import { query } from '@/lib/db';
|
import { query } from '@/lib/db';
|
||||||
import { LiveDotIcon } from '@/components/ui/icons';
|
import { LiveDotIcon } from '@/components/ui/icons';
|
||||||
import DashboardClient from '@/components/dashboard/DashboardClient';
|
import DashboardClient from '@/components/dashboard/DashboardClient';
|
||||||
|
import { Driver, DriverServerRow } from '@/types/racing';
|
||||||
export const dynamic = "force-dynamic";
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
async function getConnectedDrivers() {
|
async function getConnectedDrivers() {
|
||||||
@@ -36,7 +37,7 @@ async function getConnectedDrivers() {
|
|||||||
|
|
||||||
const rows = await query(sql);
|
const rows = await query(sql);
|
||||||
|
|
||||||
return rows.map((row: unknown) => ({
|
const drivers: Driver[] = rows.map((row: DriverServerRow) => ({
|
||||||
driver_guid: row.driver_guid,
|
driver_guid: row.driver_guid,
|
||||||
driver_name: row.driver_name,
|
driver_name: row.driver_name,
|
||||||
driver_team: row.driver_team,
|
driver_team: row.driver_team,
|
||||||
@@ -59,6 +60,8 @@ async function getConnectedDrivers() {
|
|||||||
connected_players: row.connected_players,
|
connected_players: row.connected_players,
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
return drivers;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function DashboardPage() {
|
export default async function DashboardPage() {
|
||||||
|
|||||||
Generated
+455
-390
File diff suppressed because it is too large
Load Diff
+3
-3
@@ -11,10 +11,10 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.12.2",
|
"axios": "^1.12.2",
|
||||||
"date-fns": "^4.1.0",
|
"date-fns": "^4.1.0",
|
||||||
"next": "^15",
|
"next": "^16.2.9",
|
||||||
"pg": "^8.16.3",
|
"pg": "^8.16.3",
|
||||||
"react": "^19.2.3",
|
"react": "^19.2.7",
|
||||||
"react-dom": "^19.2.3",
|
"react-dom": "^19.2.7",
|
||||||
"socket.io-client": "^4.2.0"
|
"socket.io-client": "^4.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@
|
|||||||
"moduleResolution": "bundler",
|
"moduleResolution": "bundler",
|
||||||
"resolveJsonModule": true,
|
"resolveJsonModule": true,
|
||||||
"isolatedModules": true,
|
"isolatedModules": true,
|
||||||
"jsx": "preserve",
|
"jsx": "react-jsx",
|
||||||
"incremental": true,
|
"incremental": true,
|
||||||
"plugins": [
|
"plugins": [
|
||||||
{
|
{
|
||||||
|
|||||||
+30
-2
@@ -41,8 +41,29 @@ export interface Driver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Helpful joined type for displaying drivers with their server info
|
// Helpful joined type for displaying drivers with their server info
|
||||||
export interface DriverWithServer extends Driver {
|
export interface DriverServerRow extends Driver {
|
||||||
server?: Partial<Server>; // Make it partial since we don't always need all fields
|
server_id: number;
|
||||||
|
server_name: string;
|
||||||
|
server_track: string;
|
||||||
|
server_config: string;
|
||||||
|
|
||||||
|
session_type: number;
|
||||||
|
session_flag: FlagType;
|
||||||
|
|
||||||
|
session_time: number;
|
||||||
|
session_laps: number;
|
||||||
|
session_elapsed_time: number;
|
||||||
|
|
||||||
|
session_ambient_temp: number;
|
||||||
|
session_road_temp: number;
|
||||||
|
|
||||||
|
connected_players: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface RankRow {
|
||||||
|
driver_guid: number;
|
||||||
|
user_rank: number;
|
||||||
|
user_position: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For live tracking (you mentioned getting positions from parser)
|
// For live tracking (you mentioned getting positions from parser)
|
||||||
@@ -92,6 +113,13 @@ export interface Event {
|
|||||||
updated_at: Date;
|
updated_at: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface EventCheckRow {
|
||||||
|
event_id: number;
|
||||||
|
event_status: 'OPEN' | 'CLOSED' | 'COMPLETED' | 'CANCELLED';
|
||||||
|
max_participants: number;
|
||||||
|
current_registrations: number;
|
||||||
|
}
|
||||||
|
|
||||||
export interface EventRegistration {
|
export interface EventRegistration {
|
||||||
registration_id: number;
|
registration_id: number;
|
||||||
event_id: number;
|
event_id: number;
|
||||||
|
|||||||
Reference in New Issue
Block a user