102 lines
3.1 KiB
TypeScript
102 lines
3.1 KiB
TypeScript
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 });
|
|
}
|
|
}
|