using System; using System.Collections.Generic; using System.Reflection; using System.Runtime.Serialization; using Umbraco.Core.Models.Entities; using Umbraco.Core.Strings; namespace Umbraco.Core.Models.Membership { /// /// Represents a Group for a Backoffice User /// [Serializable] [DataContract(IsReference = true)] public class UserGroup : EntityBase, IUserGroup, IReadOnlyUserGroup { private int? _startContentId; private int? _startMediaId; private string _alias; private string _icon; private string _name; private IEnumerable _permissions; private readonly List _sectionCollection; private static readonly Lazy Ps = new Lazy(); // ReSharper disable once ClassNeverInstantiated.Local // lazy-instanciated in Ps private class PropertySelectors { public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); public readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); public readonly PropertyInfo PermissionsSelector = ExpressionHelper.GetPropertyInfo>(x => x.Permissions); public readonly PropertyInfo IconSelector = ExpressionHelper.GetPropertyInfo(x => x.Icon); public readonly PropertyInfo StartContentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.StartContentId); public readonly PropertyInfo StartMediaIdSelector = ExpressionHelper.GetPropertyInfo(x => x.StartMediaId); //Custom comparer for enumerable public readonly DelegateEqualityComparer> StringEnumerableComparer = new DelegateEqualityComparer>( (enum1, enum2) => enum1.UnsortedSequenceEqual(enum2), enum1 => enum1.GetHashCode()); } /// /// Constructor to create a new user group /// public UserGroup() { _sectionCollection = new List(); } /// /// Constructor to create an existing user group /// /// /// /// /// /// public UserGroup(int userCount, string alias, string name, IEnumerable permissions, string icon) : this() { UserCount = userCount; _alias = alias; _name = name; _permissions = permissions; _icon = icon; } [DataMember] public int? StartMediaId { get => _startMediaId; set => SetPropertyValueAndDetectChanges(value, ref _startMediaId, Ps.Value.StartMediaIdSelector); } [DataMember] public int? StartContentId { get => _startContentId; set => SetPropertyValueAndDetectChanges(value, ref _startContentId, Ps.Value.StartContentIdSelector); } [DataMember] public string Icon { get => _icon; set => SetPropertyValueAndDetectChanges(value, ref _icon, Ps.Value.IconSelector); } [DataMember] public string Alias { get => _alias; set => SetPropertyValueAndDetectChanges(value.ToCleanString(CleanStringType.Alias | CleanStringType.UmbracoCase), ref _alias, Ps.Value.AliasSelector); } [DataMember] public string Name { get => _name; set => SetPropertyValueAndDetectChanges(value, ref _name, Ps.Value.NameSelector); } /// /// The set of default permissions for the user group /// /// /// By default each permission is simply a single char but we've made this an enumerable{string} to support a more flexible permissions structure in the future. /// [DataMember] public IEnumerable Permissions { get => _permissions; set => SetPropertyValueAndDetectChanges(value, ref _permissions, Ps.Value.PermissionsSelector, Ps.Value.StringEnumerableComparer); } public IEnumerable AllowedSections => _sectionCollection; public void RemoveAllowedSection(string sectionAlias) { if (_sectionCollection.Contains(sectionAlias)) _sectionCollection.Remove(sectionAlias); } public void AddAllowedSection(string sectionAlias) { if (_sectionCollection.Contains(sectionAlias) == false) _sectionCollection.Add(sectionAlias); } public void ClearAllowedSections() { _sectionCollection.Clear(); } public int UserCount { get; } } }