using Disco.Models.Services.Authorization; using Disco.Services.Authorization.Roles; using System; using System.Collections.Generic; using System.Linq; namespace Disco.Services.Authorization { public class ClaimNavigatorItem : IClaimNavigatorItem { private Func accessor { get; set; } public string Key { get; private set; } public string Name { get; private set; } public string Description { get; private set; } public bool Hidden { get; private set; } public List Children { get; private set; } public bool IsGroup { get { return Children != null; } } public bool? Value { get; private set; } internal ClaimNavigatorItem(string Key, bool Hidden) { this.Key = Key; var details = Claims.GetClaimDetails(Key); Name = details.Item1; Description = details.Item2; accessor = Claims.GetClaimAccessor(Key); this.Hidden = Hidden; } internal ClaimNavigatorItem(string Key, string Name, string Description, bool Hidden, List Children) { this.Key = Key; this.Name = Name; this.Description = Description; this.Hidden = Hidden; this.Children = Children; } private ClaimNavigatorItem() { // Private Constructor } public IClaimNavigatorItem BuildClaimTree(RoleClaims RoleClaims) { return new ClaimNavigatorItem() { Key = Key, Name = Name, Description = Description, Hidden = Hidden, accessor = accessor, Value = accessor == null ? (bool?)null : accessor(RoleClaims), Children = Children == null ? null : Children.Cast().Select(c => c.BuildClaimTree(RoleClaims)).ToList() }; } public IClaimNavigatorItem BuildClaimTree(IEnumerable RoleClaims) { return new ClaimNavigatorItem() { Key = Key, Name = Name, Description = Description, Hidden = Hidden, accessor = accessor, Value = accessor == null ? (bool?)null : RoleClaims.Any(rc => accessor(rc)), Children = Children == null ? null : Children.Cast().Select(c => c.BuildClaimTree(RoleClaims)).ToList() }; } public override string ToString() { return $"{Name}: {Key}={Value}"; } } }