import { NextResponse } from 'next/server'; import supabase from '@/lib/db'; export async function GET(request: Request) { try { const { searchParams } = new URL(request.url); const tahunAngkatan = searchParams.get('tahunAngkatan'); const jenisPrestasi = searchParams.get('jenisPrestasi'); // Validate jenisPrestasi parameter (allow null) if (jenisPrestasi && jenisPrestasi !== 'null' && jenisPrestasi !== 'undefined') { // Validate against valid enum values only if jenisPrestasi is provided const validJenisPrestasi = ['Akademik', 'Non-Akademik']; if (!validJenisPrestasi.includes(jenisPrestasi)) { return NextResponse.json( { error: `Invalid jenisPrestasi value. Must be one of: ${validJenisPrestasi.join(', ')}` }, { status: 400 } ); } } // Build query based on parameters let query = supabase .from('mahasiswa') .select(` tahun_angkatan, prestasi_mahasiswa( tingkat_prestasi, jenis_prestasi ) `); // Add tahun angkatan filter if provided if (tahunAngkatan && tahunAngkatan !== 'null' && tahunAngkatan !== 'undefined') { query = query.eq('tahun_angkatan', parseInt(tahunAngkatan)); } // Add jenis prestasi filter if provided if (jenisPrestasi && jenisPrestasi !== 'null' && jenisPrestasi !== 'undefined') { query = query.eq('prestasi_mahasiswa.jenis_prestasi', jenisPrestasi); } const { data, error } = await query; if (error) { console.error('Supabase error:', error); return NextResponse.json( { error: 'Database error' }, { status: 500 } ); } // Group and count the data in JavaScript const groupedData = data.reduce((acc: any[], row: any) => { const tahunAngkatan = row.tahun_angkatan; // Handle array of prestasi_mahasiswa const prestasiArray = Array.isArray(row.prestasi_mahasiswa) ? row.prestasi_mahasiswa : [row.prestasi_mahasiswa]; if (!tahunAngkatan) { return acc; } // Process each prestasi in the array prestasiArray.forEach((prestasi: any) => { if (!prestasi || !prestasi.tingkat_prestasi) { return; } const tingkatPrestasi = prestasi.tingkat_prestasi; const existingGroup = acc.find( (item: any) => item.tahun_angkatan === tahunAngkatan && item.tingkat_prestasi === tingkatPrestasi ); if (existingGroup) { existingGroup.tingkat_mahasiswa_prestasi++; } else { const newGroup = { tahun_angkatan: tahunAngkatan, tingkat_prestasi: tingkatPrestasi, tingkat_mahasiswa_prestasi: 1 }; acc.push(newGroup); } }); return acc; }, []); // Sort the results const sortedData = groupedData.sort((a: any, b: any) => { if (a.tahun_angkatan !== b.tahun_angkatan) { return b.tahun_angkatan - a.tahun_angkatan; } return a.tingkat_prestasi.localeCompare(b.tingkat_prestasi); }); return NextResponse.json(sortedData); } catch (error) { console.error('Error fetching data:', error); return NextResponse.json( { error: 'Internal Server Error' }, { status: 500 } ); } }