import { NextRequest, NextResponse } from 'next/server'; import supabase from '@/lib/db'; // GET - Ambil semua data dosen atau filter berdasarkan kriteria export async function GET(request: NextRequest) { try { const { searchParams } = new URL(request.url); const id = searchParams.get('id'); const search = searchParams.get('search'); // Jika ID diberikan, ambil data dosen spesifik berdasarkan ID if (id) { const { data, error } = await supabase .from('dosen') .select('*') .eq('id_dosen', id) .single(); if (error || !data) { return NextResponse.json({ message: 'Dosen not found' }, { status: 404 }); } return NextResponse.json(data); } // Bangun query berdasarkan filter let query = supabase.from('dosen').select('*'); // Tambahkan kondisi pencarian jika diberikan if (search) { query = query.or(`nama_dosen.ilike.%${search}%,nip.ilike.%${search}%`); } // Tambahkan pengurutan berdasarkan nama dosen query = query.order('nama_dosen', { ascending: true }); // Eksekusi query const { data, error } = await query; if (error) { console.error('Error fetching data:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } return NextResponse.json(data); } catch (error) { console.error('Error fetching data:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } } // POST - Buat data dosen baru export async function POST(request: NextRequest) { try { const body = await request.json(); const { nama_dosen, nip } = body; // Validate required fields if (!nama_dosen || !nip) { return NextResponse.json( { message: 'Missing required fields: nama_dosen, nip' }, { status: 400 } ); } // Validate NIP length (harus 18 karakter) if (nip.length !== 18) { return NextResponse.json( { message: 'NIP harus terdiri dari 18 karakter' }, { status: 400 } ); } // Cek apakah NIP sudah ada const { data: existingDosen, error: checkError } = await supabase .from('dosen') .select('nip') .eq('nip', nip) .single(); if (!checkError && existingDosen) { return NextResponse.json( { message: 'NIP sudah terdaftar dalam database' }, { status: 409 } ); } // Insert data dosen baru const { data, error } = await supabase .from('dosen') .insert({ nama_dosen, nip }) .select() .single(); if (error) { console.error('Error creating dosen:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } return NextResponse.json( { message: `Dosen berhasil ditambahkan`, id: data.id_dosen }, { status: 201 } ); } catch (error) { console.error('Error creating dosen:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } } // PUT - Update data dosen yang sudah ada export async function PUT(request: NextRequest) { try { const { searchParams } = new URL(request.url); const id = searchParams.get('id'); if (!id) { return NextResponse.json({ message: 'ID is required' }, { status: 400 }); } const body = await request.json(); const { nama_dosen, nip } = body; // Validate required fields if (!nama_dosen || !nip) { return NextResponse.json( { message: 'Missing required fields: nama_dosen, nip' }, { status: 400 } ); } // Validate NIP length (harus 18 karakter) if (nip.length !== 18) { return NextResponse.json( { message: 'NIP harus terdiri dari 18 karakter' }, { status: 400 } ); } // Cek apakah dosen ada const { data: existing, error: checkError } = await supabase .from('dosen') .select('*') .eq('id_dosen', id) .single(); if (checkError || !existing) { return NextResponse.json({ message: 'Dosen not found' }, { status: 404 }); } // Cek apakah NIP sudah ada untuk dosen lain const { data: existingNip, error: nipCheckError } = await supabase .from('dosen') .select('id_dosen, nip') .eq('nip', nip) .neq('id_dosen', id) .single(); if (!nipCheckError && existingNip) { return NextResponse.json( { message: 'NIP sudah digunakan oleh dosen lain' }, { status: 409 } ); } // Update dosen const { error } = await supabase .from('dosen') .update({ nama_dosen, nip }) .eq('id_dosen', id); if (error) { console.error('Error updating dosen:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } return NextResponse.json({ message: `Dosen berhasil diperbarui` }); } catch (error) { console.error('Error updating dosen:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } } // DELETE - Hapus data dosen export async function DELETE(request: NextRequest) { try { const { searchParams } = new URL(request.url); const id = searchParams.get('id'); if (!id) { return NextResponse.json({ message: 'ID is required' }, { status: 400 }); } // Cek apakah dosen ada const { data: existing, error: checkError } = await supabase .from('dosen') .select('id_dosen') .eq('id_dosen', id) .single(); if (checkError || !existing) { return NextResponse.json({ message: 'Dosen not found' }, { status: 404 }); } // Cek apakah dosen sedang digunakan sebagai pembimbing const { data: bimbinganCheck, error: bimbinganError } = await supabase .from('mahasiswa') .select('id_mahasiswa') .or(`pembimbing1_id.eq.${id},pembimbing2_id.eq.${id}`) .limit(1); if (!bimbinganError && bimbinganCheck && bimbinganCheck.length > 0) { return NextResponse.json( { message: 'Tidak dapat menghapus dosen yang sedang menjadi pembimbing mahasiswa' }, { status: 409 } ); } // Hapus dosen const { error } = await supabase .from('dosen') .delete() .eq('id_dosen', id); if (error) { console.error('Error deleting dosen:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } return NextResponse.json({ message: 'Dosen berhasil dihapus' }); } catch (error) { console.error('Error deleting dosen:', error); return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 }); } }