ayo bisa
This commit is contained in:
101
app/api/mahasiswa/bimbingan-dosen/route.ts
Normal file
101
app/api/mahasiswa/bimbingan-dosen/route.ts
Normal file
@@ -0,0 +1,101 @@
|
||||
import { NextRequest, NextResponse } from 'next/server';
|
||||
import supabase from '@/lib/db';
|
||||
|
||||
// GET - Ambil data bimbingan dosen berdasarkan status bimbingan
|
||||
export async function GET(request: NextRequest) {
|
||||
try {
|
||||
const { searchParams } = new URL(request.url);
|
||||
const tahun_angkatan = searchParams.get('tahun_angkatan');
|
||||
|
||||
let query = supabase
|
||||
.from('mahasiswa')
|
||||
.select(`
|
||||
pembimbing_1,
|
||||
pembimbing_2,
|
||||
status_bimbingan,
|
||||
tahun_angkatan,
|
||||
dosen_pembimbing_1:dosen!pembimbing_1(id_dosen, nama_dosen),
|
||||
dosen_pembimbing_2:dosen!pembimbing_2(id_dosen, nama_dosen)
|
||||
`);
|
||||
|
||||
// Filter berdasarkan tahun angkatan jika diberikan
|
||||
if (tahun_angkatan && tahun_angkatan !== 'all') {
|
||||
query = query.eq('tahun_angkatan', tahun_angkatan);
|
||||
}
|
||||
|
||||
const { data, error } = await query;
|
||||
|
||||
if (error) {
|
||||
console.error('Error fetching bimbingan data:', error);
|
||||
return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 });
|
||||
}
|
||||
|
||||
// Proses data untuk menggabungkan pembimbing 1 dan 2
|
||||
const bimbinganMap = new Map();
|
||||
|
||||
data.forEach(mahasiswa => {
|
||||
// Proses pembimbing 1
|
||||
if (mahasiswa.pembimbing_1 && mahasiswa.dosen_pembimbing_1) {
|
||||
const dosenId = (mahasiswa.dosen_pembimbing_1 as any).id_dosen;
|
||||
const dosenNama = (mahasiswa.dosen_pembimbing_1 as any).nama_dosen;
|
||||
const status = mahasiswa.status_bimbingan;
|
||||
|
||||
if (!bimbinganMap.has(dosenId)) {
|
||||
bimbinganMap.set(dosenId, {
|
||||
id_dosen: dosenId,
|
||||
nama_dosen: dosenNama,
|
||||
selesai: 0,
|
||||
belum_selesai: 0
|
||||
});
|
||||
}
|
||||
|
||||
const dosenData = bimbinganMap.get(dosenId);
|
||||
if (dosenData) {
|
||||
if (status === 'Selesai') {
|
||||
dosenData.selesai++;
|
||||
} else {
|
||||
dosenData.belum_selesai++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Proses pembimbing 2
|
||||
if (mahasiswa.pembimbing_2 && mahasiswa.dosen_pembimbing_2) {
|
||||
const dosenId = (mahasiswa.dosen_pembimbing_2 as any).id_dosen;
|
||||
const dosenNama = (mahasiswa.dosen_pembimbing_2 as any).nama_dosen;
|
||||
const status = mahasiswa.status_bimbingan;
|
||||
|
||||
if (!bimbinganMap.has(dosenId)) {
|
||||
bimbinganMap.set(dosenId, {
|
||||
id_dosen: dosenId,
|
||||
nama_dosen: dosenNama,
|
||||
selesai: 0,
|
||||
belum_selesai: 0
|
||||
});
|
||||
}
|
||||
|
||||
const dosenData = bimbinganMap.get(dosenId);
|
||||
if (dosenData) {
|
||||
if (status === 'Selesai') {
|
||||
dosenData.selesai++;
|
||||
} else {
|
||||
dosenData.belum_selesai++;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Konversi Map ke Array dan urutkan berdasarkan nama dosen A-Z
|
||||
const result = Array.from(bimbinganMap.values())
|
||||
.map(dosen => ({
|
||||
...dosen,
|
||||
total: dosen.selesai + dosen.belum_selesai
|
||||
}))
|
||||
.sort((a, b) => a.nama_dosen.localeCompare(b.nama_dosen));
|
||||
|
||||
return NextResponse.json(result);
|
||||
} catch (error) {
|
||||
console.error('Error fetching bimbingan data:', error);
|
||||
return NextResponse.json({ message: 'Internal Server Error' }, { status: 500 });
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user