using Dlhis.Entity.Sys.Entities; using Dlhis.Sys.Identity.Request; using Dlhis.Sys.Identity.Response; using Kurisu.AspNetCore.Authentication.Abstractions; using Kurisu.AspNetCore.CustomClass; using Kurisu.AspNetCore.DataAccess.Dto; using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.Utils; using Kurisu.AspNetCore.Utils.Extensions; namespace Dlhis.Sys.Identity.Services.Implements; public class RoleService : IRoleService { private readonly ICurrentUser _currentUser; private readonly RedisCache _redisCache; private readonly IDbContext _dbContext; public RoleService(ICurrentUser currentUser, IDbContext dbContext, RedisCache redisCache) { _currentUser = currentUser; _redisCache = redisCache; _dbContext = dbContext.ChangeDb("identity"); } public async Task> GetPageAsync(RolePageRequest request) { return await _dbContext.Queryable() .WhereIF(request.Search.IsPresent(), x => x.Name.Contains(request.Search) || x.NormalizedName.Contains(request.Search)) .Where(x => x.Name != "admin") .Select() .ToPageListAsync(request); } public async Task GetMyRoleAsync(int? userId) { userId ??= _currentUser.GetIntSubjectId(); return await _dbContext.Queryable() .LeftJoin((x, r) => x.RoleId == r.Id) .Where(x => x.UserId == userId) .Select() .FirstAsync(); } public async Task SaveRoleAsync(RoleSaveRequest request) { await CheckDuplicateNameAsync(request); if (!request.Id.HasValue) { await _dbContext.InsertAsync(new RoleEntity { Name = request.Name, NormalizedName = request.Name.ToUpperInvariant(), Description = request.Description, ConcurrencyStamp = Guid.NewGuid(), }); } else { var entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).FirstAsync(); entity.ThrowIfNull("角色不存在"); entity.Name = request.Name; entity.NormalizedName = request.Name.ToUpperInvariant(); entity.Description = request.Description; entity.ConcurrencyStamp = Guid.NewGuid(); await _dbContext.UpdateAsync(entity); } } public async Task AssignRoleAsync(RoleAssignRequest request) { var myUserId = _currentUser.GetIntSubjectId(); //不能被其他人修改 if (request.UserId == 1 && request.UserId != myUserId) { throw new UserFriendlyException("无法修改admin角色"); } var existsUser = await _dbContext.Queryable().Where(x => x.Id == request.UserId).AnyAsync(); existsUser.ThrowIfFalse("分配的用户不存在"); var userRole = await _dbContext.Queryable().Where(x => x.UserId == request.UserId).FirstAsync(); if (request.RoleId.HasValue) { var existsRole = await _dbContext.Queryable().Where(x => x.Id == request.RoleId).AnyAsync(); existsRole.ThrowIfFalse("分配的角色不存在"); if (userRole == null) { await _dbContext.InsertAsync(new UserRoleEntity { UserId = request.UserId, RoleId = request.RoleId.Value, }); } else { await _dbContext.Updateable() .SetColumns(x => x.RoleId == request.RoleId) .Where(x => x.UserId == request.UserId) .ExecuteCommandAsync(); } } else { await _dbContext.DeleteReallyAsync(userRole); } } /// public async Task SaveRoleObfuscateAsync(RoleObfuscateRequest request) { var role = await _dbContext.Queryable().FirstAsync(x => x.Id == request.Id); role.ThrowIfNull("角色不存在"); var key = "datapermission:role"; if (request.IsShow) { await _redisCache.ListLeftPushAsync(key, role.Name); } else { await _redisCache.ListRemoveAsync(key, role.Name); } } /// public async Task GetRoleObfuscateAsync(int id) { var role = await _dbContext.Queryable().FirstAsync(x => x.Id == id); var key = "datapermission:role"; var range = await _redisCache.ListRangeAsync(key); return range.Any(x => (string)x == role.Name); } public async Task RemoveRoleAsync(IdRequest request) { var role = await _dbContext.Queryable().FirstAsync(x => x.Id == request.Id); role.ThrowIfNull("角色不存在"); //删除角色,自动删除UserRoles对应关系 await _dbContext.DeleteReallyAsync(role); } public async Task> GetListAsync() { return await _dbContext.Queryable() .Where(x => x.Name != "admin") .Select() .ToListAsync(); } //************************************************************* help method ********************************************************************* private async Task CheckDuplicateNameAsync(RoleSaveRequest request) { var exists = await _dbContext.Queryable() .WhereIF(request.Id.HasValue, x => x.Id != request.Id) .Where(x => x.Name == request.Name) .AnyAsync(); exists.ThrowIfTrue($"重复角色名称{request.Name}"); } }