import 'package:get/get.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; class SupabaseService extends GetxService { static SupabaseService get to => Get.find(); late final SupabaseClient client; // Ganti dengan URL dan API key Supabase Anda static const String supabaseUrl = String.fromEnvironment('SUPABASE_URL', defaultValue: 'http://labulabs.net:8000'); static const String supabaseKey = String.fromEnvironment('SUPABASE_KEY', defaultValue: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ewogICJyb2xlIjogImFub24iLAogICJpc3MiOiAic3VwYWJhc2UiLAogICJpYXQiOiAxNzMxODYyODAwLAogICJleHAiOiAxODg5NjI5MjAwCn0.4IpwhwCVbfYXxb8JlZOLSBzCt6kQmypkvuso7N8Aicc'); Future init() async { await Supabase.initialize( url: supabaseUrl, anonKey: supabaseKey, ); client = Supabase.instance.client; return this; } // Metode untuk mendaftar pengguna baru Future signUp(String email, String password) async { return await client.auth.signUp( email: email, password: password, data: {'autoconfirm': true}, ); } // Metode untuk login Future signIn(String email, String password) async { return await client.auth.signInWithPassword( email: email, password: password, ); } // Metode untuk logout Future signOut() async { await client.auth.signOut(); } // Metode untuk mendapatkan user saat ini User? get currentUser => client.auth.currentUser; // Metode untuk memeriksa apakah user sudah login bool get isAuthenticated => currentUser != null; // Metode untuk mendapatkan profil pengguna Future?> getUserProfile() async { if (currentUser == null) return null; final response = await client .from('user_profile') .select() .eq('id', currentUser!.id) .maybeSingle(); return response; } // Metode untuk mendapatkan role pengguna Future getUserRole() async { final profile = await getUserProfile(); return profile?['role']; } // Metode untuk mendapatkan data berdasarkan peran Future?> getRoleSpecificData(String role) async { if (currentUser == null) return null; switch (role) { case 'WARGA': return await getWargaByUserId(); case 'PETUGASVERIFIKASI': return await getPetugasVerifikasiData(); case 'PETUGASDESA': return await getPetugasDesaData(); case 'DONATUR': return await getDonaturData(); default: return null; } } // Metode untuk mendapatkan data petugas verifikasi Future?> getPetugasVerifikasiData() async { if (currentUser == null) return null; final response = await client .from('xx02_PetugasVerifikasi') .select() .eq('userId', currentUser!.id) .maybeSingle(); return response; } // Metode untuk mendapatkan data petugas desa Future?> getPetugasDesaData() async { if (currentUser == null) return null; final response = await client .from('xx01_PetugasDesa') .select() .eq('userId', currentUser!.id) .maybeSingle(); return response; } // Metode untuk mendapatkan data donatur Future?> getDonaturData() async { if (currentUser == null) return null; final response = await client .from('xx01_Donatur') .select() .eq('userId', currentUser!.id) .maybeSingle(); return response; } // Metode untuk membuat data warga Future createWargaProfile({ required String nik, required String namaLengkap, required String jenisKelamin, String? noHp, String? alamat, String? tempatLahir, DateTime? tanggalLahir, String? agama, }) async { if (currentUser == null) return; await client.from('xx02_Warga').insert({ 'NIK': nik, 'namaLengkap': namaLengkap, 'jenisKelamin': jenisKelamin, 'noHp': noHp, 'alamat': alamat, 'tempatLahir': tempatLahir, 'tanggalLahir': tanggalLahir?.toIso8601String(), 'agama': agama, 'userId': currentUser!.id, 'email': currentUser!.email, }); } // Metode untuk mendapatkan data warga berdasarkan userId Future?> getWargaByUserId() async { if (currentUser == null) return null; final response = await client .from('xx02_Warga') .select() .eq('userId', currentUser!.id) .maybeSingle(); return response; } // Metode untuk mendapatkan notifikasi pengguna Future>> getUserNotifications( {bool unreadOnly = false}) async { if (currentUser == null) return []; final query = client.from('Notification').select(); // Tambahkan filter untuk user ID final filteredQuery = query.eq('userId', currentUser!.id); // Tambahkan filter untuk notifikasi yang belum dibaca jika diperlukan final finalQuery = unreadOnly ? filteredQuery.eq('isRead', false) : filteredQuery; // Tambahkan pengurutan final response = await finalQuery.order('CREATED_AT', ascending: false); return List>.from(response); } // Metode untuk menandai notifikasi sebagai telah dibaca Future markNotificationAsRead(int notificationId) async { await client .from('Notification') .update({'isRead': true}).eq('notificationId', notificationId); } // Metode untuk mendapatkan data verifikasi warga Future>> getVerifikasiDataWarga() async { if (currentUser == null) return []; final response = await client .from('xx02_VerifikasiDataWarga') .select() .order('CREATED_AT', ascending: false); return List>.from(response); } // Metode untuk mendapatkan data pengajuan bantuan Future>> getPengajuanBantuan() async { if (currentUser == null) return []; final response = await client .from('xx02_PengajuanKelayakanBantuan') .select() .order('CREATED_AT', ascending: false); return List>.from(response); } // Metode untuk mendapatkan data skema bantuan Future>> getSkemaBantuan() async { if (currentUser == null) return []; final response = await client .from('xx02_SkemaBantuan') .select() .order('CREATED_AT', ascending: false); return List>.from(response); } // Metode untuk mendapatkan data penyaluran bantuan Future>> getPenyaluranBantuan() async { if (currentUser == null) return []; final response = await client .from('xx01_PenyaluranBantuan') .select() .order('CREATED_AT', ascending: false); return List>.from(response); } // Metode untuk mendapatkan data penitipan bantuan Future>> getPenitipanBantuan() async { if (currentUser == null) return []; final response = await client .from('xx01_PenitipanBantuan') .select() .order('CREATED_AT', ascending: false); return List>.from(response); } // Metode untuk mendapatkan data pengaduan Future>> getPengaduan() async { if (currentUser == null) return []; final response = await client .from('xx01_Pengaduan') .select() .order('CREATED_AT', ascending: false); return List>.from(response); } }