import 'package:get/get.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; /// Oldal-/funkció-szintű jogosultságok kezelése. /// /// A jogosultságokat egy Supabase `app_permissions` tábla tárolja /// (user_id + area), és a felhasználó a saját sorait olvashatja (RLS). /// A service induláskor és bejelentkezéskor betölti a jelenlegi /// felhasználó jogosultságait egy halmazba, amit a UI reaktívan figyel. /// /// Bővíthető: új védett terület = új 'area' string (pl. 'admin'), /// a UI a [can] getterrel kérdez rá — kódmódosítás nélkül. A tényleges /// védelmet a Supabase-oldali RLS adja (a `contacts`/admin táblákon), /// ez a service csak a UI-t vezérli (menüpont elrejtése, üzenet). class PermissionService extends GetxService { static PermissionService get to => Get.find(); static const areaContacts = 'contacts'; static const areaAdmin = 'admin'; SupabaseClient get _client => Supabase.instance.client; /// A jelenlegi felhasználó engedélyezett területei. final _areas = {}.obs; final isLoaded = false.obs; bool can(String area) => _areas.contains(area); bool get canContacts => can(areaContacts); bool get canAdmin => can(areaAdmin); @override void onInit() { super.onInit(); // Induláskor és minden auth-változáskor újratöltjük. reload(); _client.auth.onAuthStateChange.listen((_) => reload()); } Future reload() async { final user = _client.auth.currentUser; if (user == null) { _areas.clear(); isLoaded.value = true; return; } try { final rows = await _client .from('terepi_seged_app_permissions') .select('area') .eq('user_id', user.id); _areas ..clear() ..addAll(rows.map((r) => r['area'] as String)); } catch (_) { // Hálózati hiba: nem adunk jogot (fail-closed), de nem is dobunk. _areas.clear(); } finally { _areas.refresh(); isLoaded.value = true; } } }