TKK_E32232276/lib/dashboard/d_c_murid/database/db_guru.dart

200 lines
6.2 KiB
Dart

import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';
class DbGuru {
final SupabaseClient _supabase = Supabase.instance.client;
Future<List<Map<String, dynamic>>> getAllGuru() async {
try {
// Fetch all guru, possibly with their class name if you have a relationship set up
// Or just fetch the table and handle join locally if needed
final response = await _supabase
.from('guru')
.select('*, class_name!guru_id_class_fkey(*)')
.or('status_akun.is.null,status_akun.eq.true');
return List<Map<String, dynamic>>.from(response);
} catch (e) {
// If there's no relationship 'class_name', fallback to normal select
try {
final fallbackResponse = await _supabase
.from('guru')
.select('*')
.or('status_akun.is.null,status_akun.eq.true');
return List<Map<String, dynamic>>.from(fallbackResponse);
} catch (e2) {
throw Exception('Gagal memuat data guru: $e2');
}
}
}
Future<List<Map<String, dynamic>>> getGuruForStudentClass() async {
try {
final prefs = await SharedPreferences.getInstance();
final userId = prefs.getString('user_id_admin');
final nis = prefs.getString('murid_nis');
if (userId == null || nis == null) return [];
// 1. Dapatkan info murid untuk mengambil id_class murid tersebut
final muridData = await _supabase
.from('murid')
.select('id_class')
.eq('user_id', userId)
.eq('nis', nis)
.maybeSingle();
if (muridData == null || muridData['id_class'] == null) return [];
final String studentClassId = muridData['id_class'].toString();
// 2. Dapatkan Wali Kelas untuk kelas tersebut
final classData = await _supabase
.from('class_name')
.select('id_guru')
.eq('id_tabel', studentClassId)
.maybeSingle();
final String? waliKelasGuruId = classData?['id_guru']?.toString();
// 3. Dapatkan guru yang mengajar di kelas murid tersebut (guru.id_class == studentClassId)
// dan juga Wali Kelas dari kelas tersebut (guru.id_tabel == waliKelasGuruId)
var query = _supabase
.from('guru')
.select('*')
.or('status_akun.is.null,status_akun.eq.true');
if (waliKelasGuruId != null && waliKelasGuruId.isNotEmpty) {
query = query.or('id_class.eq.$studentClassId,id_tabel.eq.$waliKelasGuruId');
} else {
query = query.eq('id_class', studentClassId);
}
final response = await query;
return List<Map<String, dynamic>>.from(response);
} catch (e) {
return [];
}
}
Future<List<Map<String, dynamic>>> getGuruForLoggedGuruClass() async {
try {
final prefs = await SharedPreferences.getInstance();
final userId = prefs.getString('user_id_admin');
final nik = prefs.getString('guru_nik');
if (userId == null || nik == null) return [];
// 1. Dapatkan info guru yang login
final guruData = await _supabase
.from('guru')
.select('id_tabel, id_class')
.eq('user_id', userId)
.eq('nik', nik)
.maybeSingle();
if (guruData == null) return [];
Set<String> validClassIds = {};
if (guruData['id_class'] != null) {
validClassIds.add(guruData['id_class'].toString());
}
// Ambil class_name yang terkait dengan guru ini
final classDataList = await _supabase
.from('class_name')
.select('id_tabel, id_class')
.eq('id_guru', guruData['id_tabel']);
for (var c in classDataList) {
validClassIds.add(c['id_tabel'].toString());
}
if (validClassIds.isEmpty) return [];
// 2. Ambil semua guru yang terhubung ke kelas yang sama (melalui id_class di tabel guru)
final gurusInClass = await _supabase
.from('guru')
.select('*, class_name!guru_id_class_fkey(*)')
.inFilter('id_class', validClassIds.toList())
.or('status_akun.is.null,status_akun.eq.true');
return List<Map<String, dynamic>>.from(gurusInClass);
} catch (e) {
throw Exception('Gagal memuat data guru per kelas: $e');
}
}
Future<Map<String, dynamic>> getLoggedInGuruInfo() async {
final prefs = await SharedPreferences.getInstance();
final userId = prefs.getString('user_id_admin');
final nik = prefs.getString('guru_nik');
if (userId == null || nik == null) {
throw Exception('Sesi guru tidak valid.');
}
final guruData = await _supabase
.from('guru')
.select()
.eq('user_id', userId)
.eq('nik', nik)
.maybeSingle();
if (guruData == null) {
throw Exception('Data guru tidak ditemukan.');
}
// Cek apakah wali kelas
final classData = await _supabase
.from('class_name')
.select('name_class')
.eq('id_guru', guruData['id_tabel'])
.maybeSingle();
guruData['is_wali_kelas'] = classData != null;
if (classData != null) {
guruData['class_name'] = classData['name_class'];
} else if (guruData['id_class'] != null) {
// Jika bukan wali kelas, ambil nama kelas berdasarkan id_class
final classDataById = await _supabase
.from('class_name')
.select('name_class')
.eq('id_tabel', guruData['id_class'])
.maybeSingle();
guruData['class_name'] = classDataById?['name_class'];
} else {
guruData['class_name'] = null;
}
return guruData;
}
Future<void> updateGuru({
required String idTabel,
required num nik,
required String name,
String? bidang,
String? idClass,
required bool wali,
}) async {
await _supabase.from('guru').update({
'nik': nik,
'name': name,
'bidang': bidang,
'id_class': idClass,
'wali': wali,
}).eq('id_tabel', idTabel);
}
Future<void> deleteGuru(String idTabel) async {
try {
await _supabase.from('guru').update({
'status_akun': false,
'id_class': null,
}).eq('id_tabel', idTabel);
} catch (e) {
throw Exception('Gagal menghapus guru: $e');
}
}
}