'admin/index.php', 'pimpinan' => 'pimpinan/index.php', 'enumerator' => 'enumerator/index.php', default => 'peta_publik.php', }); } function requireLogin(?string $redirect = null): void { if (!isLoggedIn()) { $redirect = $redirect ?? app_url('login.php'); header("Location: $redirect"); exit; } } /** * Izinkan akses hanya jika role pengguna ada di daftar $roles. * Jika tidak, dialihkan ke beranda role-nya sendiri. */ function requireAnyRole(array $roles, ?string $redirect = null): void { requireLogin($redirect); if (!in_array(currentRole(), $roles, true)) { header('Location: ' . roleHome(currentRole())); exit; } } /** * Kompatibilitas dengan kode lama: requireRole('operator'). */ function requireRole(string $role, ?string $redirect = null): void { requireAnyRole([$role], $redirect); } /** * Cek role tanpa redirect (untuk tampilan kondisional menu). */ function hasAnyRole(array $roles): bool { return isLoggedIn() && in_array(currentRole(), $roles, true); } function currentUser(): array { return [ 'id' => $_SESSION['user_id'] ?? null, 'username' => $_SESSION['username'] ?? '', 'email' => $_SESSION['email'] ?? '', 'role' => $_SESSION['role'] ?? '', 'wilayah_tugas'=> $_SESSION['wilayah_tugas'] ?? '', 'nama_lengkap' => $_SESSION['nama_lengkap'] ?? '', ]; } /** * Label role yang ramah ditampilkan. */ function roleLabel(string $role): string { return match ($role) { 'operator' => 'Operator', 'pimpinan' => 'Pimpinan', 'enumerator' => 'Enumerator', 'publik' => 'Publik', default => ucfirst($role), }; }