Files
jinko.yikatong/Src/Dlhis.Sys/Identity/Services/Implements/RoleService.cs

175 lines
5.8 KiB
C#

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<Pagination<RoleResponse>> GetPageAsync(RolePageRequest request)
{
return await _dbContext.Queryable<RoleEntity>()
.WhereIF(request.Search.IsPresent(), x => x.Name.Contains(request.Search) || x.NormalizedName.Contains(request.Search))
.Where(x => x.Name != "admin")
.Select<RoleResponse>()
.ToPageListAsync(request);
}
public async Task<RoleResponse> GetMyRoleAsync(int? userId)
{
userId ??= _currentUser.GetIntSubjectId();
return await _dbContext.Queryable<UserRoleEntity>()
.LeftJoin<RoleEntity>((x, r) => x.RoleId == r.Id)
.Where(x => x.UserId == userId)
.Select<RoleResponse>()
.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<RoleEntity>().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<UserEntity>().Where(x => x.Id == request.UserId).AnyAsync();
existsUser.ThrowIfFalse("分配的用户不存在");
var userRole = await _dbContext.Queryable<UserRoleEntity>().Where(x => x.UserId == request.UserId).FirstAsync();
if (request.RoleId.HasValue)
{
var existsRole = await _dbContext.Queryable<RoleEntity>().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<UserRoleEntity>()
.SetColumns(x => x.RoleId == request.RoleId)
.Where(x => x.UserId == request.UserId)
.ExecuteCommandAsync();
}
}
else
{
await _dbContext.DeleteReallyAsync(userRole);
}
}
/// <inheritdoc />
public async Task SaveRoleObfuscateAsync(RoleObfuscateRequest request)
{
var role = await _dbContext.Queryable<RoleEntity>().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);
}
}
/// <inheritdoc />
public async Task<bool> GetRoleObfuscateAsync(int id)
{
var role = await _dbContext.Queryable<RoleEntity>().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<RoleEntity>().FirstAsync(x => x.Id == request.Id);
role.ThrowIfNull("角色不存在");
//删除角色,自动删除UserRoles对应关系
await _dbContext.DeleteReallyAsync(role);
}
public async Task<List<RoleResponse>> GetListAsync()
{
return await _dbContext.Queryable<RoleEntity>()
.Where(x => x.Name != "admin")
.Select<RoleResponse>()
.ToListAsync();
}
//************************************************************* help method *********************************************************************
private async Task CheckDuplicateNameAsync(RoleSaveRequest request)
{
var exists = await _dbContext.Queryable<RoleEntity>()
.WhereIF(request.Id.HasValue, x => x.Id != request.Id)
.Where(x => x.Name == request.Name)
.AnyAsync();
exists.ThrowIfTrue($"重复角色名称{request.Name}");
}
}