static PermissionHelper() { var permissionTabViewModels = new List <PermissionTab>(); var assembly = Assembly.GetExecutingAssembly(); var controllers = assembly.GetExportedTypes() .Where(type => type.IsPublic && type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(ControllerBase)) && type.GetCustomAttribute <AllowAnonymousAttribute>() == null) .Select(controller => new { ControllerFullName = controller.FullName, ControllerName = GetControllerName(controller), ControllerGroupName = GetControllerGroupName(controller), Actions = controller.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public) .Where(method => method.IsPublic && method.GetCustomAttribute <NonActionAttribute>() == null && method.GetCustomAttribute <AllowAnonymousAttribute>() == null) .Select(method => new { ActionName = GetActionName(method), ActionFullName = controller.FullName + "." + method.Name }).ToList(), }).ToList(); foreach (var tab in controllers.GroupBy(p => p.ControllerGroupName)) { var tabViewModel = new PermissionTab { Name = tab.Key }; foreach (var controller in tab) { var controllerViewModel = new PermissionController { Name = controller.ControllerName, FullName = controller.ControllerFullName }; foreach (var action in controller.Actions.GroupBy(p => p.ActionName)) { var actionViewModel = new PermissionAction { Name = action.Key, FullNames = action.Select(p => p.ActionFullName).Distinct().ToList() }; controllerViewModel.Actions.Add(actionViewModel); } tabViewModel.Controllers.Add(controllerViewModel); } Tabs.Add(tabViewModel); } }
public static IServiceCollection PopulatePermissions(this IServiceCollection services, params Assembly[] assemblies) { var permissionTabViewModels = new List<PermissionTab>(); var handlers = assemblies.SelectMany(p => p.GetExportedTypes()) .Where(type => type.IsPublic && type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(IRequestHandler<,>)) && type.GetCustomAttribute<AllowAnonymousAttribute>() == null) .Select(handler => { var attribute = handler.GetCustomAttribute<HandlerInfoAttribute>(); var namespaceLastSegment = handler.Namespace.Remove(handler.Namespace.IndexOf('.'); return new { handler.FullName, TabName = attribute?.TabName ?? namespaceLastSegment, GroupName = attribute.GroupName ?? namespaceLastSegment, Name = attribute.Name ?? handler.Name }; }).ToList(); foreach (var tab in handlers.GroupBy(p => p.TabName)) { var tabViewModel = new PermissionTab { Name = tab.Key }; foreach (var group in tab.GroupBy(p => p.GroupName)) { var controllerViewModel = new PermissionRequestGroup { Name = group.ControllerName, FullName = group.ControllerFullName }; foreach (var action in group.GroupBy(p => p.Name)) { var actionViewModel = new PermissionRequest { Name = action.Key, FullNames = action.Select(p => p.ActionFullName).Distinct().ToList() }; controllerViewModel.Actions.Add(actionViewModel); } tabViewModel.Controllers.Add(controllerViewModel); } List.Add(tabViewModel); } }