63 lines
2.0 KiB
Dart
63 lines
2.0 KiB
Dart
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 = <String>{}.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<void> 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;
|
|
}
|
|
}
|
|
}
|