import { NextResponse } from 'next/server'; import supabase from '@/lib/db'; interface MahasiswaTotal { 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; total_mahasiswa_aktif_lulus: number; total_mahasiswa_beasiswa: number; total_mahasiswa_beasiswa_pemerintah: number; total_mahasiswa_beasiswa_non_pemerintah: 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(request: Request) { try { // Ambil parameter tahun angkatan dari query string const { searchParams } = new URL(request.url); const tahunAngkatan = searchParams.get('tahun_angkatan'); // Jumlah mahasiswa let totalMahasiswaQuery = supabase .from('mahasiswa') .select('*', { count: 'exact', head: true }); if (tahunAngkatan && tahunAngkatan !== 'all') { totalMahasiswaQuery = totalMahasiswaQuery.eq('tahun_angkatan', parseInt(tahunAngkatan)); } const { count: totalMahasiswa } = await totalMahasiswaQuery; // Ambil mahasiswa aktif let mahasiswaAktifQuery = supabase .from('mahasiswa') .select('*', { count: 'exact', head: true }) .eq('status_kuliah', 'Aktif'); if (tahunAngkatan && tahunAngkatan !== 'all') { mahasiswaAktifQuery = mahasiswaAktifQuery.eq('tahun_angkatan', parseInt(tahunAngkatan)); } const { count: mahasiswaAktif } = await mahasiswaAktifQuery; // Ambil total lulus let totalLulusQuery = supabase .from('mahasiswa') .select('*', { count: 'exact', head: true }) .eq('status_kuliah', 'Lulus'); if (tahunAngkatan && tahunAngkatan !== 'all') { totalLulusQuery = totalLulusQuery.eq('tahun_angkatan', parseInt(tahunAngkatan)); } const { count: totalLulus } = await totalLulusQuery; // Ambil pria lulus let priaLulusQuery = supabase .from('mahasiswa') .select('*', { count: 'exact', head: true }) .eq('status_kuliah', 'Lulus') .eq('jk', 'Pria'); if (tahunAngkatan && tahunAngkatan !== 'all') { priaLulusQuery = priaLulusQuery.eq('tahun_angkatan', parseInt(tahunAngkatan)); } const { count: priaLulus } = await priaLulusQuery; // Ambil wanita lulus let wanitaLulusQuery = supabase .from('mahasiswa') .select('*', { count: 'exact', head: true }) .eq('status_kuliah', 'Lulus') .eq('jk', 'Wanita'); if (tahunAngkatan && tahunAngkatan !== 'all') { wanitaLulusQuery = wanitaLulusQuery.eq('tahun_angkatan', parseInt(tahunAngkatan)); } const { count: wanitaLulus } = await wanitaLulusQuery; // Ambil total berprestasi let prestasiTotalQuery = supabase .from('prestasi_mahasiswa') .select('*, mahasiswa!inner(tahun_angkatan)', { count: 'exact', head: true }); if (tahunAngkatan && tahunAngkatan !== 'all') { prestasiTotalQuery = prestasiTotalQuery.eq('mahasiswa.tahun_angkatan', parseInt(tahunAngkatan)); } const { count: totalBerprestasi } = await prestasiTotalQuery; // Ambil prestasi akademik let prestasiAkademikQuery = supabase .from('prestasi_mahasiswa') .select('*, mahasiswa!inner(tahun_angkatan)', { count: 'exact', head: true }) .eq('jenis_prestasi', 'Akademik'); if (tahunAngkatan && tahunAngkatan !== 'all') { prestasiAkademikQuery = prestasiAkademikQuery.eq('mahasiswa.tahun_angkatan', parseInt(tahunAngkatan)); } const { count: prestasiAkademik } = await prestasiAkademikQuery; // Ambil prestasi non-akademik let prestasiNonAkademikQuery = supabase .from('prestasi_mahasiswa') .select('*, mahasiswa!inner(tahun_angkatan)', { count: 'exact', head: true }) .eq('jenis_prestasi', 'Non-Akademik'); if (tahunAngkatan && tahunAngkatan !== 'all') { prestasiNonAkademikQuery = prestasiNonAkademikQuery.eq('mahasiswa.tahun_angkatan', parseInt(tahunAngkatan)); } const { count: prestasiNonAkademik } = await prestasiNonAkademikQuery; // Ambil total mahasiswa aktif + lulus let totalMahasiswaAktifLulusQuery = supabase .from('mahasiswa') .select('*', { count: 'exact', head: true }) .in('status_kuliah', ['Aktif', 'Lulus']); if (tahunAngkatan && tahunAngkatan !== 'all') { totalMahasiswaAktifLulusQuery = totalMahasiswaAktifLulusQuery.eq('tahun_angkatan', parseInt(tahunAngkatan)); } const { count: totalMahasiswaAktifLulus } = await totalMahasiswaAktifLulusQuery; // Total mahasiswa beasiswa let beasiswaTotalQuery = supabase .from('beasiswa_mahasiswa') .select('*, mahasiswa!inner(tahun_angkatan)', { count: 'exact', head: true }); if (tahunAngkatan && tahunAngkatan !== 'all') { beasiswaTotalQuery = beasiswaTotalQuery.eq('mahasiswa.tahun_angkatan', parseInt(tahunAngkatan)); } const { count: totalMahasiswaBeasiswa } = await beasiswaTotalQuery; // Total mahasiswa beasiswa Pemerintah let beasiswaPemerintahQuery = supabase .from('beasiswa_mahasiswa') .select('*, mahasiswa!inner(tahun_angkatan)', { count: 'exact', head: true }) .eq('jenis_beasiswa', 'Pemerintah'); if (tahunAngkatan && tahunAngkatan !== 'all') { beasiswaPemerintahQuery = beasiswaPemerintahQuery.eq('mahasiswa.tahun_angkatan', parseInt(tahunAngkatan)); } const { count: totalMahasiswaBeasiswaPemerintah } = await beasiswaPemerintahQuery; // Total mahasiswa beasiswa Non-Pemerintah let beasiswaNonPemerintahQuery = supabase .from('beasiswa_mahasiswa') .select('*, mahasiswa!inner(tahun_angkatan)', { count: 'exact', head: true }) .eq('jenis_beasiswa', 'Non-Pemerintah'); if (tahunAngkatan && tahunAngkatan !== 'all') { beasiswaNonPemerintahQuery = beasiswaNonPemerintahQuery.eq('mahasiswa.tahun_angkatan', parseInt(tahunAngkatan)); } const { count: totalMahasiswaBeasiswaNonPemerintah } = await beasiswaNonPemerintahQuery; const results: MahasiswaTotal = { total_mahasiswa: totalMahasiswa || 0, mahasiswa_aktif: mahasiswaAktif || 0, total_lulus: totalLulus || 0, pria_lulus: priaLulus || 0, wanita_lulus: wanitaLulus || 0, total_berprestasi: totalBerprestasi || 0, prestasi_akademik: prestasiAkademik || 0, prestasi_non_akademik: prestasiNonAkademik || 0, total_mahasiswa_aktif_lulus: totalMahasiswaAktifLulus || 0, total_mahasiswa_beasiswa: totalMahasiswaBeasiswa || 0, total_mahasiswa_beasiswa_pemerintah: totalMahasiswaBeasiswaPemerintah || 0, total_mahasiswa_beasiswa_non_pemerintah: totalMahasiswaBeasiswaNonPemerintah || 0, }; // Menambahkan header cache dan CORS return NextResponse.json(results, { 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', }, } ); } }