Files
portaldata/app/api/keloladata/data-mahasiswa/route.ts
Randa Firman Putra 886fc59d28 ayo bisa
2025-09-16 14:22:37 +07:00

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 });
}
}