using Easy.AuthorityManagement.Clean.Shared.IServices; using Easy.AuthorityManagement.Clean.Shared.Modles; using Easy.Authorization.Abstractions; using Easy.DDD.Domain; using Easy.Snowflakes; namespace Easy.AuthorityManagement.Clean.Domain.Services; public class PermissionGrantManager : DomainService, IPermissionGrantManager { protected ISnowflakeIdGenerator SnowflakeIdGenerator => LazyServiceProvider.LazyGetService(); protected IRepository PermissionGrantRepository => LazyServiceProvider.LazyGetService>(); protected IPermissionDefinitionManager PermissionDefinitionManager => LazyServiceProvider.LazyGetService(); public async Task> GetPermissionNamesAsync(params (string providerName, long providerKey)[] providerKeys) { var values = new List(); foreach (var providerKey in providerKeys) { var permissionNames = await PermissionGrantRepository.Set .Where(o => o.ProviderName == providerKey.providerName && o.ProviderKey == providerKey.providerKey) .Select(o => o.PermissionName) .ToListAsync(); values.AddRange(permissionNames); } return values.Distinct(); } public async Task> GetPermissionGrantsAsync(string providerName, long providerKey) { var permissionNames = await GetPermissionNamesAsync((providerName, providerKey)); var permissionGroups = GetPermissionGroups(permissionNames); return permissionGroups; } public List GetPermissionGroups(IEnumerable permissionNames) { var permissionGroups = new List(); foreach (var group in PermissionDefinitionManager.GetGroups()) { var permissionGroupValueObject = new PermissionGroupModel() { Description = group.Description, DisplayName = group.DisplayName, GroupName = group.GroupName, Permissions = new List() }; foreach (var permission in group.Permissions) { var per = new PermissionModel() { Children = new List(), Description = permission.Description, DisplayName = permission.DisplayName, IsEnabled = permission.IsEnabled, PermissionName = permission.PermissionName, IsGranted = permissionNames.Contains(permission.PermissionName) }; foreach (var childPermission in permission.Children) { per.Children.Add(new() { Description = childPermission.Description, DisplayName = childPermission.DisplayName, IsEnabled = childPermission.IsEnabled, PermissionName = childPermission.PermissionName, IsGranted = per.IsGranted == true || permissionNames.Contains(childPermission.PermissionName) }); } permissionGroupValueObject.Permissions.Add(per); } permissionGroups.Add(permissionGroupValueObject); } return permissionGroups; } //private static void SetPermissions(PermissionDefinition permissionDefinition, PermissionGroupValueObject permissionGroup) //{ // //父权限 // if (permissionDefinition.Parent == null) // { // //添加父权限 // permissionGroup.Permissions.Add(new PermissionValueObject() // { // PermissionName = permissionDefinition.PermissionName, // Description = permissionDefinition.Description, // DisplayName = permissionDefinition.DisplayName, // IsEnabled = permissionDefinition.IsEnabled, // Children = new List() // }); // } // //子权限 // else // { // //判断组里面是否有父权限 // var permission = permissionGroup.Permissions.FirstOrDefault(o => o.PermissionName == permissionDefinition.Parent.PermissionName); // if (permission == null) // { // permissionGroup.Permissions.Add(new PermissionValueObject() // { // PermissionName = permissionDefinition.PermissionName, // Description = permissionDefinition.Description, // DisplayName = permissionDefinition.DisplayName, // IsEnabled = permissionDefinition.IsEnabled, // Children = new List() // }); // } // //添加子权限 // permission.Children.Add(new PermissionValueObject() // { // PermissionName = permissionDefinition.PermissionName, // Description = permissionDefinition.Description, // DisplayName = permissionDefinition.DisplayName, // IsEnabled = permissionDefinition.IsEnabled, // }); // } //} public async Task SetAsync(string permissionName, string providerName, long providerKey, bool isGranted) { var permission = PermissionDefinitionManager.Get(permissionName); When.Is(!permission.IsEnabled, $"这个权限 '{permissionName}' 被禁用!"); if (isGranted) { var permissionGrant = new PermissionGrant(SnowflakeIdGenerator.Create(), permission.PermissionName, providerName, providerKey); await PermissionGrantRepository.Set.SingleInsertAsync(permissionGrant); } else { var permissionGrant = await PermissionGrantRepository.Set .Where(o => o.PermissionName == permissionName) .Where(o => o.ProviderKey == providerKey) .FirstOrDefaultAsync(); if (permissionGrant == null) { return; } await PermissionGrantRepository.Set.SingleUpdateAsync(permissionGrant); } } }