PermissionTree.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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)
  21. {
  22. if (CodeHashSet.Contains(code)) throw new ArgumentException($"重复的权限代码:{code},名称:{name}");
  23. var node = new PermissionNode(this, code, name, description, nameForOperator, descriptionForOperator, side);
  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)
  30. {
  31. return FltTree(_roots, side, new HashSet<string>(licPerms));
  32. }
  33. private static IReadOnlyCollection<PermissionNodeOutput> FltTree(IReadOnlyCollection<PermissionNode> nodesFrom, MultiTenancySides side, IReadOnlySet<string> licPerms, List<PermissionNodeOutput> output = null)
  34. {
  35. output ??= new List<PermissionNodeOutput>();
  36. foreach (var node in nodesFrom)
  37. {
  38. if (!licPerms.Contains(node.Code)) continue;
  39. if (node.TenancySide != side) continue;
  40. var copy = side == MultiTenancySides.Tenant
  41. ? new PermissionNodeOutput(node.Code, node.Name, node.Description)
  42. : new PermissionNodeOutput(node.Code, node.NameForOperator ?? node.Name, node.DescriptionForOperator ?? node.Description);
  43. output.Add(copy);
  44. FltTree(node.Children, side, licPerms, copy.Children);
  45. }
  46. return output;
  47. }
  48. /// <summary> 完成初始化, 释放并返回重名检查集合, 提供扁平集合, 禁止再加挂节点 </summary>
  49. public HashSet<string> CompleteAdding()
  50. {
  51. var toReturn = _codeHashSet;
  52. AllNodes = _allNode.ToArray();
  53. _codeHashSet = null;
  54. return toReturn;
  55. }
  56. }
  57. }