241 lines
6.8 KiB
TypeScript
241 lines
6.8 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import supabase from '@/lib/db';
|
|
|
|
// GET - Fetch all mahasiswa or a specific one by NIM
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const { searchParams } = new URL(request.url);
|
|
const nim = searchParams.get('nim');
|
|
|
|
if (nim) {
|
|
// Fetch specific mahasiswa by NIM with joins
|
|
const { data, error } = await supabase
|
|
.from('mahasiswa')
|
|
.select(`
|
|
*,
|
|
kelompok_keahlian!id_kelompok_keahlian(id_kk, nama_kelompok)
|
|
`)
|
|
.eq('nim', nim)
|
|
.single();
|
|
|
|
if (error || !data) {
|
|
return NextResponse.json({ message: 'Mahasiswa not found' }, { status: 404 });
|
|
}
|
|
|
|
// Transform the data to flatten the joined fields
|
|
const transformedData = {
|
|
...data,
|
|
nama_kelompok_keahlian: data.kelompok_keahlian?.nama_kelompok || null
|
|
};
|
|
delete transformedData.kelompok_keahlian;
|
|
|
|
return NextResponse.json(transformedData);
|
|
} else {
|
|
// Fetch all mahasiswa with joins
|
|
const { data, error } = await supabase
|
|
.from('mahasiswa')
|
|
.select(`
|
|
*,
|
|
kelompok_keahlian!id_kelompok_keahlian(id_kk, nama_kelompok)
|
|
`)
|
|
.order('nim');
|
|
|
|
if (error) {
|
|
console.error('Error fetching data:', error);
|
|
return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 });
|
|
}
|
|
|
|
// Transform the data to flatten the joined fields
|
|
const transformedData = data.map(item => ({
|
|
...item,
|
|
nama_kelompok_keahlian: item.kelompok_keahlian?.nama_kelompok || null
|
|
})).map(({ kelompok_keahlian, ...rest }) => rest);
|
|
|
|
return NextResponse.json(transformedData);
|
|
}
|
|
} catch (error) {
|
|
console.error('Error fetching data:', error);
|
|
return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 });
|
|
}
|
|
}
|
|
|
|
// POST - Create a new mahasiswa
|
|
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
|
|
} = body;
|
|
|
|
// Validate required fields
|
|
if (!nim || !nama || !jk || !tahun_angkatan) {
|
|
return NextResponse.json(
|
|
{ message: 'Missing required fields: nim, nama, jk, tahun_angkatan' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
// Check if mahasiswa already exists
|
|
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 new mahasiswa
|
|
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
|
|
})
|
|
.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 an existing mahasiswa
|
|
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
|
|
} = body;
|
|
|
|
// Check if mahasiswa exists
|
|
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
|
|
})
|
|
.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 - Delete a 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 });
|
|
}
|
|
|
|
// Delete 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 });
|
|
}
|
|
}
|