import { NextResponse } from 'next/server'; import pool from '@/lib/db'; import { RowDataPacket } from 'mysql2'; interface MahasiswaTotal extends RowDataPacket { total_mahasiswa: number; mahasiswa_aktif: number; total_lulus: number; pria_lulus: number; wanita_lulus: number; total_berprestasi: number; prestasi_akademik: number; prestasi_non_akademik: number; ipk_rata_rata_aktif: number; ipk_rata_rata_lulus: number; total_mahasiswa_aktif_lulus: number; } // Fungsi untuk menangani preflight request (OPTIONS) export async function OPTIONS() { return new NextResponse(null, { status: 200, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type, Authorization', 'Access-Control-Max-Age': '86400', // 24 jam }, }); } export async function GET() { const connection = await pool.getConnection(); try { // Query gabungan untuk semua data const [results] = await connection.query(` SELECT (SELECT COUNT(*) FROM mahasiswa) AS total_mahasiswa, (SELECT COUNT(*) FROM mahasiswa m JOIN status_mahasiswa s ON m.nim = s.nim WHERE s.status_kuliah = 'Aktif') AS mahasiswa_aktif, (SELECT COUNT(*) FROM mahasiswa m JOIN status_mahasiswa s ON m.nim = s.nim WHERE s.status_kuliah = 'Lulus') AS total_lulus, (SELECT COUNT(*) FROM mahasiswa m JOIN status_mahasiswa s ON m.nim = s.nim WHERE s.status_kuliah = 'Lulus' AND m.jk = 'Pria') AS pria_lulus, (SELECT COUNT(*) FROM mahasiswa m JOIN status_mahasiswa s ON m.nim = s.nim WHERE s.status_kuliah = 'Lulus' AND m.jk = 'Wanita') AS wanita_lulus, (SELECT COUNT(*) FROM prestasi_mahasiswa) AS total_berprestasi, (SELECT COUNT(*) FROM prestasi_mahasiswa WHERE jenis_prestasi = 'Akademik') AS prestasi_akademik, (SELECT COUNT(*) FROM prestasi_mahasiswa WHERE jenis_prestasi = 'Non-Akademik') AS prestasi_non_akademik, (SELECT COUNT(*) FROM mahasiswa m JOIN status_mahasiswa s ON m.nim = s.nim WHERE s.status_kuliah IN ('Aktif', 'Lulus')) AS total_mahasiswa_aktif_lulus, (SELECT ROUND(AVG(m.ipk), 2) FROM mahasiswa m JOIN status_mahasiswa s ON m.nim = s.nim WHERE s.status_kuliah = 'Aktif') AS ipk_rata_rata_aktif, (SELECT ROUND(AVG(m.ipk), 2) FROM mahasiswa m JOIN status_mahasiswa s ON m.nim = s.nim WHERE s.status_kuliah = 'Lulus') AS ipk_rata_rata_lulus `); // Menambahkan header cache dan CORS return NextResponse.json(results[0], { headers: { 'Cache-Control': 'public, max-age=60, stale-while-revalidate=30', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type, Authorization', }, }); } catch (error) { console.error('Error fetching total mahasiswa:', error); return NextResponse.json( { error: 'Failed to fetch total mahasiswa' }, { status: 500, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type, Authorization', }, } ); } finally { connection.release(); } }