using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Reflection; using gehGassi.Permissions; using Microsoft.Extensions.Localization; namespace gehGassi.Web.Helper { public class PermissionDisplay { public PermissionDisplay(string groupName, string name, string description, Permission permission) { Permission = permission; GroupName = groupName; ShortName = name ?? throw new ArgumentNullException(nameof(name)); Description = description ?? throw new ArgumentNullException(nameof(description)); } /// /// GroupName, which groups permissions working in the same area /// public string GroupName { get; private set; } /// /// ShortName of the permission - often says what it does, e.g. Read /// public string ShortName { get; private set; } /// /// Long description of what action this permission allows /// public string Description { get; private set; } /// /// Gives the actual permission /// public Permission Permission { get; private set; } /// /// Contains an optional paidForModule that this feature is linked to /// public string ModuleName { get; private set; } /// /// This returns /// /// public static List GetPermissionsToDisplay(Type enumType, IStringLocalizer localizer) { var result = new List(); foreach (var permissionName in Enum.GetNames(enumType)) { var member = enumType.GetMember(permissionName); //This allows you to obsolete a permission and it won't be shown as a possible option, but is still there so you won't reuse the number var obsoleteAttribute = member[0].GetCustomAttribute(); if (obsoleteAttribute != null) continue; //If there is no DisplayAttribute then the Enum is not used var displayAttribute = member[0].GetCustomAttribute(); if (displayAttribute == null) continue; var permission = (Permission)Enum.Parse(enumType, permissionName, false); result.Add(new PermissionDisplay(localizer[displayAttribute.GroupName], localizer[displayAttribute.Name], localizer[displayAttribute.Description], permission)); } return result; } /// /// This returns /// /// public static List GetPermissionsToDisplay(Type enumType, string role, IStringLocalizer localizer) { var result = new List(); foreach (var permissionName in Enum.GetNames(enumType)) { var member = enumType.GetMember(permissionName); //This allows you to obsolete a permission and it won't be shown as a possible option, but is still there so you won't reuse the number var obsoleteAttribute = member[0].GetCustomAttribute(); if (obsoleteAttribute != null) continue; //If there is no DisplayAttribute then the Enum is not used var displayAttribute = member[0].GetCustomAttribute(); if (displayAttribute == null) continue; var permissionRolesAttribute = member[0].GetCustomAttribute(); if (permissionRolesAttribute == null) continue; var permission = (Permission)Enum.Parse(enumType, permissionName, false); if (permissionRolesAttribute.Roles.Contains(role)) { result.Add(new PermissionDisplay(localizer[displayAttribute.GroupName], localizer[displayAttribute.Name], localizer[displayAttribute.Description], permission)); } } return result; } } }