1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- using System;
- using System.Collections.Generic;
- namespace VCommon.VApplication.Authorization
- {
- public class PermissionTree
- {
- private readonly List<PermissionNode> _roots = new();
- private HashSet<string> _codeHashSet = new();
- internal List<PermissionNode> _allNode = new();
- internal HashSet<string> CodeHashSet
- {
- get
- {
- if (null == _codeHashSet) throw new InvalidOperationException("Final called");
- return _codeHashSet;
- }
- }
- public IReadOnlyCollection<PermissionNode> AllNodes { get; private set; }
- public IReadOnlyCollection<PermissionNode> Roots => _roots;
- public PermissionNode CreateRootNode(string code, string name, string description = null, string nameForOperator = null, string descriptionForOperator = null, MultiTenancySides side = MultiTenancySides.Both, object customData = null)
- {
- if (CodeHashSet.Contains(code)) throw new ArgumentException($"重复的权限代码:{code},名称:{name}");
- var node = new PermissionNode(this, code, name, description, nameForOperator, descriptionForOperator, side, customData);
- _roots.Add(node);
- _allNode.Add(node);
- CodeHashSet.Add(code);
- return node;
- }
- public IReadOnlyCollection<PermissionNodeOutput> Filter(MultiTenancySides side, IReadOnlyCollection<string> licPerms, object customData = null)
- {
- return FltTree(_roots, side, licPerms == null ? null : new HashSet<string>(licPerms), customData: customData);
- }
- private static IReadOnlyCollection<PermissionNodeOutput> FltTree(IReadOnlyCollection<PermissionNode> nodesFrom, MultiTenancySides side, IReadOnlySet<string> licPerms, List<PermissionNodeOutput> output = null, object customData = null)
- {
- output ??= new List<PermissionNodeOutput>();
- foreach (var node in nodesFrom)
- {
- if (licPerms != null) if (!licPerms.Contains(node.Code)) continue;
- if (node.TenancySide != MultiTenancySides.Both && node.TenancySide != side) continue;
- if (customData == null || false == customData.Equals(node.CustomData)) continue;
- var copy = side == MultiTenancySides.Tenant
- ? new PermissionNodeOutput(node.Code, node.Name, node.Description)
- : new PermissionNodeOutput(node.Code, node.NameForOperator ?? node.Name, node.DescriptionForOperator ?? node.Description);
- output.Add(copy);
- FltTree(node.Children, side, licPerms, copy.Children);
- }
- return output;
- }
- /// <summary> 完成初始化, 释放并返回重名检查集合, 提供扁平集合, 禁止再加挂节点 </summary>
- public HashSet<string> CompleteAdding()
- {
- var toReturn = _codeHashSet;
- AllNodes = _allNode.ToArray();
- _codeHashSet = null;
- return toReturn;
- }
- public void Lookup(Action<PermissionNode> visit)
- {
- foreach (var node in Roots)
- {
- node.Traverse(visit);
- }
- }
- }
- }
|