docs: ai 协作文档体系重构与多 ai 仲裁结果落地
1.AI 协作文档体系重构(objections/worklines/contracts+matrix.md) 2.coord 仲裁文档(final-decisions/cross-review/final-rulings/orchestration) 3.各服务 01/02 文档补全 4.共享包初始化(shared-ts/shared-go/hooks/ui-components/ui-tokens) 5.Proto 契约补全 6.004 架构影响地图更新 7.端口分配表 8.设计规格文档
This commit is contained in:
76
packages/hooks/src/use-permission.ts
Normal file
76
packages/hooks/src/use-permission.ts
Normal file
@@ -0,0 +1,76 @@
|
||||
import { useCallback, useMemo } from "react";
|
||||
import type { PermissionContext } from "./types.js";
|
||||
|
||||
/**
|
||||
* usePermission - 权限查询 Hook
|
||||
*
|
||||
* 用途:L2 路由级 + L3 组件级视口控制。
|
||||
* 权限点命名遵循 F7 裁决:`<RESOURCE>_<ACTION>`(如 `EXAM_READ`)。
|
||||
* 数据范围用后缀 `_OWN`/`_CHILD`(如 `GRADE_READ_CHILD`)。
|
||||
*
|
||||
* 注意:权限数据由调用方注入(apps/* 从 iam /iam/permissions/effective 获取后传入)。
|
||||
* 本 hook 不直接调 API,保持纯客户端逻辑。
|
||||
*
|
||||
* @example
|
||||
* const { hasPermission, hasAny, hasAll } = usePermission({ permissions, dataScope, roles });
|
||||
*
|
||||
* if (hasPermission("EXAM_CREATE")) { ... }
|
||||
* if (hasPermission("GRADE_READ_CHILD")) { ... } // 数据范围后缀
|
||||
*/
|
||||
|
||||
export interface UsePermissionProps {
|
||||
/** 权限上下文(从 iam /iam/permissions/effective 获取) */
|
||||
context: PermissionContext | null;
|
||||
}
|
||||
|
||||
export interface UsePermissionReturn {
|
||||
/** 检查是否拥有指定权限点 */
|
||||
hasPermission: (perm: string) => boolean;
|
||||
/** 检查是否拥有任一权限点 */
|
||||
hasAny: (...perms: string[]) => boolean;
|
||||
/** 检查是否拥有全部权限点 */
|
||||
hasAll: (...perms: string[]) => boolean;
|
||||
/** 检查是否拥有指定角色 */
|
||||
hasRole: (role: string) => boolean;
|
||||
/** 当前数据范围 */
|
||||
dataScope: PermissionContext["dataScope"] | null;
|
||||
}
|
||||
|
||||
export function usePermission({
|
||||
context,
|
||||
}: UsePermissionProps): UsePermissionReturn {
|
||||
const permissions = context?.permissions ?? [];
|
||||
const roles = context?.roles ?? [];
|
||||
const dataScope = context?.dataScope ?? null;
|
||||
|
||||
const permissionSet = useMemo(() => new Set(permissions), [permissions]);
|
||||
const roleSet = useMemo(() => new Set(roles), [roles]);
|
||||
|
||||
const hasPermission = useCallback(
|
||||
(perm: string): boolean => permissionSet.has(perm),
|
||||
[permissionSet],
|
||||
);
|
||||
|
||||
const hasAny = useCallback(
|
||||
(...perms: string[]): boolean => perms.some((p) => permissionSet.has(p)),
|
||||
[permissionSet],
|
||||
);
|
||||
|
||||
const hasAll = useCallback(
|
||||
(...perms: string[]): boolean => perms.every((p) => permissionSet.has(p)),
|
||||
[permissionSet],
|
||||
);
|
||||
|
||||
const hasRole = useCallback(
|
||||
(role: string): boolean => roleSet.has(role),
|
||||
[roleSet],
|
||||
);
|
||||
|
||||
return {
|
||||
hasPermission,
|
||||
hasAny,
|
||||
hasAll,
|
||||
hasRole,
|
||||
dataScope,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user