CaiWuXiTong/app/Utilities/SidebarPermissions.php
WuYongJie 9595267ee7
Some checks failed
Tests / PHP 8.1 (push) Has been cancelled
Tests / PHP 8.2 (push) Has been cancelled
Tests / PHP 8.3 (push) Has been cancelled
chore: 导入 Akaunting 初始源码与团队协作规则
2026-07-20 18:20:25 +08:00

89 lines
2.2 KiB
PHP

<?php
namespace App\Utilities;
use App\Models\Auth\User;
class SidebarPermissions
{
public static function settings(): array
{
$value = setting('system.sidebar_permissions', []);
if (is_string($value)) {
$value = json_decode($value, true) ?: [];
}
return is_array($value) ? $value : [];
}
public static function subjectKey(User $user): string
{
$userKey = 'user_' . $user->id;
$settings = self::settings();
if (in_array($userKey, $settings['configured'] ?? [], true)) {
return $userKey;
}
return 'role_' . SystemAccess::roleName($user);
}
public static function allowedKeys(User $user): ?array
{
$settings = self::settings();
$subject = self::subjectKey($user);
if (! in_array($subject, $settings['configured'] ?? [], true)) {
return null;
}
return array_values(array_unique((array) ($settings['subjects'][$subject] ?? [])));
}
public static function navigationFor(User $user): array
{
$navigation = BusinessNavigation::all();
$allowed = self::allowedKeys($user);
if ($allowed === null) {
return $navigation;
}
return array_values(array_filter(array_map(function (array $section) use ($allowed) {
$sectionKey = $section['slug'];
if (in_array($sectionKey, $allowed, true)) {
return $section;
}
$pages = array_values(array_filter($section['pages'] ?? [], function (array $page) use ($allowed, $sectionKey) {
return in_array($sectionKey . '/' . $page['slug'], $allowed, true);
}));
if (! empty($pages)) {
$section['pages'] = $pages;
return $section;
}
return null;
}, $navigation)));
}
public static function allKeys(): array
{
$keys = [];
foreach (BusinessNavigation::all() as $section) {
$keys[] = $section['slug'];
foreach ($section['pages'] ?? [] as $page) {
$keys[] = $section['slug'] . '/' . $page['slug'];
}
}
return $keys;
}
}