76 lines
2.5 KiB
TypeScript
76 lines
2.5 KiB
TypeScript
import { createClient } from '@supabase/supabase-js'
|
|
|
|
import { NextResponse } from 'next/server'
|
|
|
|
const facilityTypes = {
|
|
0: "OBS",
|
|
1: "FSS",
|
|
2: "DEL",
|
|
3: "GND",
|
|
4: "TWR",
|
|
5: "APP",
|
|
6: "CTR",
|
|
} as const;
|
|
|
|
// Define FIR coverage
|
|
const CZQM_AIRPORTS = ["CYHZ", "CYFC", "CYQM", "CYSJ", "CYZX", "CYYG", "CYYT", "CYQX", "CYYR", "LFVP", "CYQI", "CYAY", "CYDF", "CYJT"];
|
|
|
|
export async function GET() {
|
|
try {
|
|
// Fetch current VATSIM data
|
|
const response = await fetch('https://data.vatsim.net/v3/vatsim-data.json');
|
|
if (!response.ok) throw new Error('Failed to fetch VATSIM data');
|
|
const data = await response.json();
|
|
|
|
const supabase = createClient(process.env.NEXT_PUBLIC_SUPABASE_URL, process.env.NEXT_SECRET_SUPABASE_KEY)
|
|
|
|
// Filter controllers in CZQM airspace
|
|
const czqmControllers = data.controllers.filter((controller: any) => {
|
|
const callsign = controller.callsign;
|
|
// console.log(callsign)
|
|
return callsign.startsWith('CZQM_') ||
|
|
callsign.startsWith('CZQX_') ||
|
|
CZQM_AIRPORTS.some(airport => callsign.startsWith(airport));
|
|
});
|
|
|
|
// Process each controller
|
|
for (const controller of czqmControllers) {
|
|
const facilityType = facilityTypes[controller.facility as keyof typeof facilityTypes];
|
|
const airport = CZQM_AIRPORTS.find(ap => controller.callsign.startsWith(ap)) || 'CZQM';
|
|
|
|
// Insert or update controller session
|
|
const { error } = await supabase
|
|
.from('controller_sessions')
|
|
.upsert({
|
|
cid: controller.cid,
|
|
name: controller.name,
|
|
callsign: controller.callsign,
|
|
facility_type: facilityType,
|
|
frequency: controller.frequency,
|
|
airport: airport,
|
|
last_seen: new Date().toISOString(),
|
|
logon_time: controller.logon_time,
|
|
});
|
|
|
|
if (error) {
|
|
console.error('Error updating controller session:', error);
|
|
}
|
|
}
|
|
|
|
// Clean up old sessions (controllers who have logged off)
|
|
const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000).toISOString();
|
|
const { error: cleanupError } = await supabase
|
|
.from('controller_sessions')
|
|
.delete()
|
|
.lt('last_seen', fiveMinutesAgo);
|
|
|
|
if (cleanupError) {
|
|
console.error('Error cleaning up old sessions:', cleanupError);
|
|
}
|
|
|
|
return NextResponse.json({ success: true });
|
|
} catch (error) {
|
|
console.error('Error in controller update:', error);
|
|
return NextResponse.json({ error: 'Failed to update controller data' }, { status: 500 });
|
|
}
|
|
} |