UnisKB/ui/src/utils/permission/index.ts

64 lines
1.8 KiB
TypeScript
Raw Normal View History

import useStore from '@/stores'
2025-04-25 08:27:13 +00:00
import { Role, Permission, ComplexPermission } from '@/utils/permission/type'
2025-06-16 09:02:36 +00:00
import { isFunction } from '@/utils/common'
type PF = () => Role | string | Permission | ComplexPermission
2025-04-25 08:27:13 +00:00
/**
*
* @param permission
* @returns True false
*/
2025-06-16 09:02:36 +00:00
const hasPermissionChild = (permission: Role | string | Permission | ComplexPermission | PF) => {
const { user } = useStore()
2025-04-25 08:27:13 +00:00
const permissions = user.getPermissions()
2025-06-16 09:02:36 +00:00
const role: Array<string> = user.getRole()
2025-04-25 08:27:13 +00:00
if (!permission) {
return true
}
2025-06-16 09:02:36 +00:00
if (isFunction(permission)) {
permission = (permission as PF)()
}
2025-04-25 08:27:13 +00:00
if (permission instanceof Role) {
2025-06-16 09:02:36 +00:00
return role.includes(permission.role)
2025-04-25 08:27:13 +00:00
}
if (permission instanceof Permission) {
return permissions.includes(permission.permission)
}
if (permission instanceof ComplexPermission) {
const permissionOk = permission.permissionList.some((p) => permissions.includes(p))
2025-06-16 09:02:36 +00:00
const roleOk = role.some((r) => permission.roleList.includes(r))
2025-04-25 08:27:13 +00:00
return permission.compare === 'AND' ? permissionOk && roleOk : permissionOk || roleOk
}
if (typeof permission === 'string') {
return permissions.includes(permission)
}
return false
}
/**
*
* @param role
* @param permissions
* @param requiredPermissions
* @returns
*/
export const hasPermission = (
permission:
2025-06-16 09:02:36 +00:00
| Array<Role | string | Permission | ComplexPermission | PF>
2025-04-25 08:27:13 +00:00
| Role
| string
| Permission
2025-06-16 09:02:36 +00:00
| ComplexPermission
| PF,
compare: 'OR' | 'AND',
2025-04-25 08:27:13 +00:00
): boolean => {
if (permission instanceof Array) {
return compare === 'OR'
? permission.some((p) => hasPermissionChild(p))
: permission.every((p) => hasPermissionChild(p))
} else {
return hasPermissionChild(permission)
}
}