/** * 权限键映射工具 * 用于处理数据库权限键与路由装饰器检查权限键不一致的情况 */ /** * 权限键映射表 * key: 数据库中的权限键 * value: 前端显示和实际生效的权限键 * * 当前配置:不做映射,直接显示数据库权限键 * 因为权限已经细分为CRUD操作,不需要合并显示 */ const PERMISSION_KEY_MAP: Record = { // 知识库绑定相关 - 直接显示数据库权限键,不映射 // 'dify:bind:list': 'dify:bind:list', // 'dify:bind:create': 'dify:bind:create', // 'dify:bind:update': 'dify:bind:update', // 'dify:bind:delete': 'dify:bind:delete', }; /** * 反向映射表:实际权限键 -> 数据库权限键列表 * 当前配置:不进行反向映射 */ const REVERSE_PERMISSION_MAP: Record = { // 'dify:bind:list': ['dify:bind:list'], }; /** * 将数据库权限键转换为显示权限键 * @param permissionKey 数据库中的权限键 * @returns 前端显示的权限键(无映射时返回原值) */ export function mapPermissionKey(permissionKey: string): string { return PERMISSION_KEY_MAP[permissionKey] || permissionKey; } /** * 批量转换权限键列表 * @param permissionKeys 权限键数组 * @returns 转换后的权限键数组(去重) */ export function mapPermissionKeys(permissionKeys: string[]): string[] { const mappedKeys = permissionKeys.map(key => mapPermissionKey(key)); return [...new Set(mappedKeys)]; // 去重 } /** * 反向查找:根据显示权限键找到对应的数据库权限键 * @param effectivePermissionKey 显示权限键 * @returns 对应的数据库权限键列表(无映射时返回原值) */ export function reverseMapPermissionKey(permissionKey: string): string[] { // 查找所有映射到该权限键的原始权限键 const originalKeys: string[] = []; for (const [key, mappedKey] of Object.entries(PERMISSION_KEY_MAP)) { if (mappedKey === permissionKey) { originalKeys.push(key); } } return originalKeys.length > 0 ? originalKeys : [permissionKey]; } /** * 转换权限对象:将数据库权限对象转换为显示权限对象 */ export interface Permission { id: number; permission_key: string; display_name: string; api_method?: string; api_path?: string; [key: string]: any; } export function mapPermission(permission: Permission): Permission { const mappedKey = mapPermissionKey(permission.permission_key); // 如果权限键被映射,更新显示名称(可根据业务逻辑调整) let displayName = permission.display_name; if (mappedKey !== permission.permission_key) { // 这里可以添加自定义的显示名称映射逻辑 } return { ...permission, permission_key: mappedKey, display_name: displayName, }; } /** * 批量转换权限列表 * @param permissions 权限对象数组 * @returns 转换后的权限对象数组(去重) */ export function mapPermissions(permissions: Permission[]): Permission[] { const mappedMap = new Map(); permissions.forEach(permission => { const mapped = mapPermission(permission); // 如果映射后的权限键已存在,合并(保留第一个) if (!mappedMap.has(mapped.permission_key)) { mappedMap.set(mapped.permission_key, mapped); } }); return Array.from(mappedMap.values()); } /** * 根据显示的权限ID查找对应的数据库权限ID(用于保存) */ export function findDbPermissionIds( displayPermissionId: number, allMappedPermissions: Permission[], originalPermissions: Permission[] ): number[] { const displayPerm = allMappedPermissions.find(p => p.id === displayPermissionId); if (!displayPerm) return []; const dbKeys = reverseMapPermissionKey(displayPerm.permission_key); const dbIds: number[] = []; for (const key of dbKeys) { const originalPerm = originalPermissions.find(p => p.permission_key === key); if (originalPerm) { dbIds.push(originalPerm.id); } } return dbIds; } /** * 检查权限是否受映射影响 */ export function hasPermissionMapping(permissionKey: string): boolean { return PERMISSION_KEY_MAP[permissionKey] !== undefined; } /** * 获取权限映射的说明信息 */ export function getPermissionMappingInfo(): string { return `权限映射说明:\n` + `当前未启用权限键映射,直接使用数据库权限键`; }