import { NextRequest, NextResponse } from 'next/server'; import supabase from '@/lib/db'; // GET - Ambil semua data mahasiswa atau satu mahasiswa spesifik berdasarkan NIM export async function GET(request: NextRequest) { try { const { searchParams } = new URL(request.url); const nim = searchParams.get('nim'); if (nim) { // Ambil mahasiswa spesifik berdasarkan NIM dengan join const { data, error } = await supabase .from('mahasiswa') .select(` *, kelompok_keahlian!id_kelompok_keahlian(id_kk, nama_kelompok), dosen_pembimbing_1:dosen!pembimbing_1(id_dosen, nama_dosen), dosen_pembimbing_2:dosen!pembimbing_2(id_dosen, nama_dosen) `) .eq('nim', nim) .single(); if (error || !data) { return NextResponse.json({ message: 'Mahasiswa not found' }, { status: 404 }); } // Transformasi data untuk meratakan field yang di-join const transformedData = { ...data, nama_kelompok_keahlian: data.kelompok_keahlian?.nama_kelompok || null, nama_pembimbing_1: data.dosen_pembimbing_1?.nama_dosen || null, nama_pembimbing_2: data.dosen_pembimbing_2?.nama_dosen || null }; delete transformedData.kelompok_keahlian; delete transformedData.dosen_pembimbing_1; delete transformedData.dosen_pembimbing_2; return NextResponse.json(transformedData); } else { // Ambil semua mahasiswa dengan join const { data, error } = await supabase .from('mahasiswa') .select(` *, kelompok_keahlian!id_kelompok_keahlian(id_kk, nama_kelompok), dosen_pembimbing_1:dosen!pembimbing_1(id_dosen, nama_dosen), dosen_pembimbing_2:dosen!pembimbing_2(id_dosen, nama_dosen) `) .order('nim'); if (error) { console.error('Error fetching data:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } // Transformasi data untuk meratakan field yang di-join const transformedData = data.map(item => ({ ...item, nama_kelompok_keahlian: item.kelompok_keahlian?.nama_kelompok || null, nama_pembimbing_1: item.dosen_pembimbing_1?.nama_dosen || null, nama_pembimbing_2: item.dosen_pembimbing_2?.nama_dosen || null })).map(({ kelompok_keahlian, dosen_pembimbing_1, dosen_pembimbing_2, ...rest }) => rest); return NextResponse.json(transformedData); } } catch (error) { console.error('Error fetching data:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } } // POST - Buat data mahasiswa baru export async function POST(request: NextRequest) { try { const body = await request.json(); const { nim, nama, jk, agama, kabupaten, provinsi, jenis_pendaftaran, tahun_angkatan, ipk, id_kelompok_keahlian, status_kuliah, semester, pembimbing_1, pembimbing_2, status_bimbingan } = body; // Validasi field yang wajib diisi if (!nim || !nama || !jk || !tahun_angkatan) { return NextResponse.json( { message: 'Missing required fields: nim, nama, jk, tahun_angkatan' }, { status: 400 } ); } // Cek apakah mahasiswa sudah ada const { data: existing, error: checkError } = await supabase .from('mahasiswa') .select('nim') .eq('nim', nim) .single(); if (existing) { return NextResponse.json( { message: 'Mahasiswa with this NIM already exists' }, { status: 409 } ); } // Insert mahasiswa baru const { data, error } = await supabase .from('mahasiswa') .insert({ nim, nama, jk, agama: agama || null, kabupaten: kabupaten || null, provinsi: provinsi || null, jenis_pendaftaran: jenis_pendaftaran || null, tahun_angkatan, ipk: ipk || null, id_kelompok_keahlian: id_kelompok_keahlian || null, status_kuliah: status_kuliah || "Aktif", semester: semester || 1, pembimbing_1: pembimbing_1 || null, pembimbing_2: pembimbing_2 || null, status_bimbingan: status_bimbingan || "Belum Selesai" }) .select() .single(); if (error) { console.error('Error creating mahasiswa:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } return NextResponse.json( { message: 'Mahasiswa created successfully', nim }, { status: 201 } ); } catch (error) { console.error('Error creating mahasiswa:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } } // PUT - Update data mahasiswa yang sudah ada export async function PUT(request: NextRequest) { try { const { searchParams } = new URL(request.url); const nim = searchParams.get('nim'); if (!nim) { return NextResponse.json({ message: 'NIM is required' }, { status: 400 }); } const body = await request.json(); const { nama, jk, agama, kabupaten, provinsi, jenis_pendaftaran, tahun_angkatan, ipk, id_kelompok_keahlian, status_kuliah, semester, pembimbing_1, pembimbing_2, status_bimbingan } = body; // Cek apakah mahasiswa ada const { data: existing, error: checkError } = await supabase .from('mahasiswa') .select('*') .eq('nim', nim) .single(); if (checkError || !existing) { return NextResponse.json({ message: 'Mahasiswa not found' }, { status: 404 }); } // Update mahasiswa const { error } = await supabase .from('mahasiswa') .update({ nama: nama || existing.nama, jk: jk || existing.jk, agama: agama || existing.agama, kabupaten: kabupaten || existing.kabupaten, provinsi: provinsi || existing.provinsi, jenis_pendaftaran: jenis_pendaftaran || existing.jenis_pendaftaran, tahun_angkatan: tahun_angkatan || existing.tahun_angkatan, ipk: ipk || existing.ipk, id_kelompok_keahlian: id_kelompok_keahlian || existing.id_kelompok_keahlian, status_kuliah: status_kuliah || existing.status_kuliah, semester: semester || existing.semester, pembimbing_1: pembimbing_1 !== undefined ? pembimbing_1 : existing.pembimbing_1, pembimbing_2: pembimbing_2 !== undefined ? pembimbing_2 : existing.pembimbing_2, status_bimbingan: status_bimbingan || existing.status_bimbingan }) .eq('nim', nim); if (error) { console.error('Error updating mahasiswa:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } return NextResponse.json({ message: 'Mahasiswa updated successfully', nim }); } catch (error) { console.error('Error updating mahasiswa:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } } // DELETE - Hapus data mahasiswa export async function DELETE(request: NextRequest) { try { const { searchParams } = new URL(request.url); const nim = searchParams.get('nim'); if (!nim) { return NextResponse.json({ message: 'NIM is required' }, { status: 400 }); } // Check if mahasiswa exists const { data: existing, error: checkError } = await supabase .from('mahasiswa') .select('nim') .eq('nim', nim) .single(); if (checkError || !existing) { return NextResponse.json({ message: 'Mahasiswa not found' }, { status: 404 }); } // Hapus mahasiswa const { error } = await supabase .from('mahasiswa') .delete() .eq('nim', nim); if (error) { console.error('Error deleting mahasiswa:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } return NextResponse.json({ message: 'Mahasiswa deleted successfully' }); } catch (error) { console.error('Error deleting mahasiswa:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } }