新增职务权限管理与聊天室管理权限控制

This commit is contained in:
2026-04-21 16:43:17 +08:00
parent cfdbf387af
commit 281315d1cf
19 changed files with 1243 additions and 87 deletions
@@ -0,0 +1,92 @@
<?php
/**
* 文件功能:职务权限判断服务
* 负责把当前用户的在职职务权限转换为统一布尔判断,
* 供控制器和 Blade 视图复用。
*/
namespace App\Services;
use App\Models\User;
use App\Support\PositionPermissionRegistry;
/**
* 类功能:统一提供用户职务权限读取与校验方法。
*/
class PositionPermissionService
{
/**
* 返回当前用户拥有的全部聊天室权限码。
*
* 规则:
* - id=1 站长始终拥有全部权限
* - 其他用户仅按当前在职职务的 permissions 生效
*
* @return list<string>
*/
public function permissionsForUser(?User $user): array
{
if (! $user) {
return [];
}
if ($user->id === 1) {
return PositionPermissionRegistry::codes();
}
$position = $user->activePosition?->position;
if (! $position) {
return [];
}
return array_values(array_intersect(
PositionPermissionRegistry::codes(),
$position->permissions ?? [],
));
}
/**
* 返回当前用户全部权限的布尔映射表。
*
* @return array<string, bool>
*/
public function permissionMapForUser(?User $user): array
{
$permissionMap = array_fill_keys(PositionPermissionRegistry::codes(), false);
foreach ($this->permissionsForUser($user) as $permission) {
$permissionMap[$permission] = true;
}
return $permissionMap;
}
/**
* 判断用户是否拥有指定权限码。
*/
public function hasPermission(?User $user, string $permission): bool
{
if (! in_array($permission, PositionPermissionRegistry::codes(), true)) {
return false;
}
return in_array($permission, $this->permissionsForUser($user), true);
}
/**
* 判断用户是否至少拥有一项指定权限。
*
* @param list<string> $permissions
*/
public function hasAnyPermission(?User $user, array $permissions): bool
{
foreach ($permissions as $permission) {
if ($this->hasPermission($user, $permission)) {
return true;
}
}
return false;
}
}