103 lines
4.3 KiB
C#
103 lines
4.3 KiB
C#
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));
|
|
}
|
|
|
|
/// <summary>
|
|
/// GroupName, which groups permissions working in the same area
|
|
/// </summary>
|
|
public string GroupName { get; private set; }
|
|
/// <summary>
|
|
/// ShortName of the permission - often says what it does, e.g. Read
|
|
/// </summary>
|
|
public string ShortName { get; private set; }
|
|
/// <summary>
|
|
/// Long description of what action this permission allows
|
|
/// </summary>
|
|
public string Description { get; private set; }
|
|
/// <summary>
|
|
/// Gives the actual permission
|
|
/// </summary>
|
|
public Permission Permission { get; private set; }
|
|
/// <summary>
|
|
/// Contains an optional paidForModule that this feature is linked to
|
|
/// </summary>
|
|
public string ModuleName { get; private set; }
|
|
|
|
|
|
/// <summary>
|
|
/// This returns
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public static List<PermissionDisplay> GetPermissionsToDisplay(Type enumType, IStringLocalizer localizer)
|
|
{
|
|
var result = new List<PermissionDisplay>();
|
|
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<ObsoleteAttribute>();
|
|
if (obsoleteAttribute != null)
|
|
continue;
|
|
//If there is no DisplayAttribute then the Enum is not used
|
|
var displayAttribute = member[0].GetCustomAttribute<DisplayAttribute>();
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// This returns
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public static List<PermissionDisplay> GetPermissionsToDisplay(Type enumType, string role, IStringLocalizer localizer)
|
|
{
|
|
var result = new List<PermissionDisplay>();
|
|
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<ObsoleteAttribute>();
|
|
if (obsoleteAttribute != null)
|
|
continue;
|
|
//If there is no DisplayAttribute then the Enum is not used
|
|
var displayAttribute = member[0].GetCustomAttribute<DisplayAttribute>();
|
|
if (displayAttribute == null)
|
|
continue;
|
|
var permissionRolesAttribute = member[0].GetCustomAttribute<PermissionRolesAttribute>();
|
|
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;
|
|
}
|
|
}
|
|
}
|