Ver código fonte

chore: 更新应用授权菜单时,清理该应用下的越权菜单数据

喵你个旺呀 1 ano atrás
pai
commit
ab2dd6c2d5

+ 18 - 7
Admin.NET/Admin.NET.Core/Service/Appliication/SysAppService.cs

@@ -12,13 +12,17 @@ namespace Admin.NET.Core.Service;
 [ApiDescriptionSettings(Name = "SysApp", Order = 495)]
 public class SysAppService : IDynamicApiController, ITransient
 {
+    private readonly SqlSugarRepository<SysAppMenu> _sysAppMenuRep;
     private readonly SqlSugarRepository<SysApp> _sysAppRep;
+    private readonly SysAuthService _sysAuthService;
     private readonly UserManager _userManager;
 
-    public SysAppService(SqlSugarRepository<SysApp> sysAppRep, UserManager userManager)
+    public SysAppService(SqlSugarRepository<SysApp> sysAppRep, SqlSugarRepository<SysAppMenu> sysAppMenuRep, SysAuthService sysAuthService, UserManager userManager)
     {
         _sysAppRep = sysAppRep;
         _userManager = userManager;
+        _sysAppMenuRep = sysAppMenuRep;
+        _sysAuthService = sysAuthService;
     }
 
     /// <summary>
@@ -83,7 +87,7 @@ public class SysAppService : IDynamicApiController, ITransient
         if (await _sysAppRep.Context.Queryable<SysTenant>().AnyAsync(u => u.AppId == input.Id)) throw Oops.Oh(ErrorCodeEnum.A1001);
         
         // 禁止删除存在关联菜单的应用
-        if (await _sysAppRep.Context.Queryable<SysAppMenu>().AnyAsync(u => u.AppId == input.Id)) throw Oops.Oh(ErrorCodeEnum.A1002);
+        if (await _sysAppMenuRep.AsQueryable().AnyAsync(u => u.AppId == input.Id)) throw Oops.Oh(ErrorCodeEnum.A1002);
         
         await _sysAppRep.DeleteAsync(entity);
     }
@@ -98,7 +102,7 @@ public class SysAppService : IDynamicApiController, ITransient
     [ApiDescriptionSettings(Name = "GrantMenu"), HttpGet]
     public async Task<List<long>> GrantMenu([FromQuery]long id)
     {
-         return await _sysAppRep.ChangeRepository<SqlSugarRepository<SysAppMenu>>().AsQueryable().Where(u => u.AppId == id).Select(u => u.MenuId).ToListAsync();
+         return await _sysAppMenuRep.AsQueryable().Where(u => u.AppId == id).Select(u => u.MenuId).ToListAsync();
     }
     
     /// <summary>
@@ -112,12 +116,19 @@ public class SysAppService : IDynamicApiController, ITransient
     public async Task GrantMenu(UpdateAppMenuInput input)
     {
         input.MenuIdList ??= new();
-        var rep = _sysAppRep.ChangeRepository<SqlSugarRepository<SysAppMenu>>();
         
-        await rep.DeleteAsync(u => u.AppId == input.Id);
+        await _sysAppMenuRep.DeleteAsync(u => u.AppId == input.Id);
         
         var list = input.MenuIdList.Select(id => new SysAppMenu { AppId = input.Id, MenuId = id }).ToList();
-        await rep.InsertRangeAsync(list);
+        
+        await _sysAppMenuRep.InsertRangeAsync(list);
+
+        // 清除应用下其他模块越权的授权数据,包括角色菜单,用户收藏菜单
+        var tenantIds = await _sysAppRep.Context.Queryable<SysTenant>().Where(u => u.AppId == input.Id).Select(u => u.Id).ToListAsync();
+        var roleIds = await _sysAppRep.Context.Queryable<SysRole>().Where(u => tenantIds.Contains((long)u.TenantId)).Select(u => u.Id).ToListAsync();
+        var userIds = await _sysAppRep.Context.Queryable<SysUser>().Where(u => tenantIds.Contains((long)u.TenantId)).Select(u => u.Id).ToListAsync();
+        await _sysAppRep.Context.Deleteable<SysRoleMenu>().Where(u => roleIds.Contains(u.RoleId) && !input.MenuIdList.Contains(u.MenuId)).ExecuteCommandAsync();
+        await _sysAppRep.Context.Deleteable<SysUserMenu>().Where(u => userIds.Contains(u.UserId) && !input.MenuIdList.Contains(u.MenuId)).ExecuteCommandAsync();
     }
     
     /// <summary>
@@ -160,7 +171,7 @@ public class SysAppService : IDynamicApiController, ITransient
         var user = await _sysAppRep.Context.Queryable<SysUser>().FirstAsync(u => u.Id == _userManager.UserId);
         user.TenantId = input.TenantId;
         
-        return await App.GetRequiredService<SysAuthService>().CreateToken(user, input.Id);
+        return await _sysAuthService.CreateToken(user, input.Id);
     }
 
     /// <summary>