263 lines
8.1 KiB
TypeScript
263 lines
8.1 KiB
TypeScript
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 });
|
|
}
|
|
}
|