import { NextResponse } from 'next/server'; import supabase from '@/lib/db'; interface IpkLulusTepat { tahun_angkatan: number; rata_rata_ipk: number; } export async function GET(request: Request) { try { const { searchParams } = new URL(request.url); const tahunAngkatan = searchParams.get('tahunAngkatan'); let query = supabase .from('status_mahasiswa') .select('semester, mahasiswa!inner(tahun_angkatan, ipk)') .eq('status_kuliah', 'Lulus') .lte('semester', 8) .not('mahasiswa.ipk', 'is', null); if (tahunAngkatan && tahunAngkatan !== 'all') { query = query.eq('mahasiswa.tahun_angkatan', parseInt(tahunAngkatan)); } const { data, error } = await query; if (error) { console.error('Error fetching IPK lulus tepat data:', error); return NextResponse.json( { error: 'Failed to fetch IPK lulus tepat data' }, { status: 500 } ); } // Group by tahun_angkatan and calculate average IPK const groupedData = data.reduce((acc, item: any) => { const tahun_angkatan = item.mahasiswa.tahun_angkatan; const ipk = item.mahasiswa.ipk; if (!acc[tahun_angkatan]) { acc[tahun_angkatan] = { total_ipk: 0, count: 0 }; } acc[tahun_angkatan].total_ipk += ipk; acc[tahun_angkatan].count += 1; return acc; }, {} as Record); // Convert to final format and sort const results: IpkLulusTepat[] = Object.entries(groupedData) .map(([tahun_angkatan, data]) => ({ tahun_angkatan: parseInt(tahun_angkatan), rata_rata_ipk: Math.round((data.total_ipk / data.count) * 100) / 100 })) .sort((a, b) => { // Sort by tahun_angkatan ASC return a.tahun_angkatan - b.tahun_angkatan; }); return NextResponse.json(results); } catch (error) { console.error('Error fetching data:', error); return NextResponse.json( { error: 'Internal Server Error' }, { status: 500 } ); } }