PermissionTree.cs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System;
  2. using System.Collections.Generic;
  3. namespace VCommon.VApplication.Authorization
  4. {
  5. public class PermissionTree
  6. {
  7. private readonly List<PermissionNode> _roots = new();
  8. private HashSet<string> _codeHashSet = new();
  9. internal List<PermissionNode> _allNode = new();
  10. internal HashSet<string> CodeHashSet
  11. {
  12. get
  13. {
  14. if (null == _codeHashSet) throw new InvalidOperationException("Final called");
  15. return _codeHashSet;
  16. }
  17. }
  18. public IReadOnlyCollection<PermissionNode> AllNodes { get; private set; }
  19. public IReadOnlyCollection<PermissionNode> Roots => _roots;
  20. public PermissionNode CreateRootNode(string code, string name, string description = null, string nameForOperator = null, string descriptionForOperator = null, MultiTenancySides side = MultiTenancySides.Both, object customData = null)
  21. {
  22. if (CodeHashSet.Contains(code)) throw new ArgumentException($"重复的权限代码:{code},名称:{name}");
  23. var node = new PermissionNode(this, code, name, description, nameForOperator, descriptionForOperator, side, customData);
  24. _roots.Add(node);
  25. _allNode.Add(node);
  26. CodeHashSet.Add(code);
  27. return node;
  28. }
  29. public IReadOnlyCollection<PermissionNodeOutput> Filter(MultiTenancySides side, IReadOnlyCollection<string> licPerms, object customData = null)
  30. {
  31. return FltTree(_roots, side, licPerms == null ? null : new HashSet<string>(licPerms), customData: customData);
  32. }
  33. private static IReadOnlyCollection<PermissionNodeOutput> FltTree(IReadOnlyCollection<PermissionNode> nodesFrom, MultiTenancySides side, IReadOnlySet<string> licPerms, List<PermissionNodeOutput> output = null, object customData = null)
  34. {
  35. output ??= new List<PermissionNodeOutput>();
  36. foreach (var node in nodesFrom)
  37. {
  38. if (licPerms != null) if (!licPerms.Contains(node.Code)) continue;
  39. if (node.TenancySide != MultiTenancySides.Both && node.TenancySide != side) continue;
  40. if (customData == null || false == customData.Equals(node.CustomData)) continue;
  41. var copy = side == MultiTenancySides.Tenant
  42. ? new PermissionNodeOutput(node.Code, node.Name, node.Description)
  43. : new PermissionNodeOutput(node.Code, node.NameForOperator ?? node.Name, node.DescriptionForOperator ?? node.Description);
  44. output.Add(copy);
  45. FltTree(node.Children, side, licPerms, copy.Children);
  46. }
  47. return output;
  48. }
  49. /// <summary> 完成初始化, 释放并返回重名检查集合, 提供扁平集合, 禁止再加挂节点 </summary>
  50. public HashSet<string> CompleteAdding()
  51. {
  52. var toReturn = _codeHashSet;
  53. AllNodes = _allNode.ToArray();
  54. _codeHashSet = null;
  55. return toReturn;
  56. }
  57. public void Lookup(Action<PermissionNode> visit)
  58. {
  59. foreach (var node in Roots)
  60. {
  61. node.Traverse(visit);
  62. }
  63. }
  64. }
  65. }