forked from ddrilling/AsbCloudServer
fix UserService
This commit is contained in:
parent
a8e1c4bd06
commit
dfacd04b47
@ -8,6 +8,7 @@ namespace AsbCloudApp.Services
|
|||||||
public interface IUserRoleService : ICrudService<UserRoleDto>
|
public interface IUserRoleService : ICrudService<UserRoleDto>
|
||||||
{
|
{
|
||||||
Task<UserRoleDto> GetByNameAsync(string name, CancellationToken token = default);
|
Task<UserRoleDto> GetByNameAsync(string name, CancellationToken token = default);
|
||||||
|
Task<IEnumerable<UserRoleDto>> GetByNamesAsync(IEnumerable<string> names, CancellationToken token = default);
|
||||||
List<UserRoleDto> GetNestedById(int id, int counter = 10);
|
List<UserRoleDto> GetNestedById(int id, int counter = 10);
|
||||||
bool HasPermission(IEnumerable<int> rolesIds, string permissionName);
|
bool HasPermission(IEnumerable<int> rolesIds, string permissionName);
|
||||||
}
|
}
|
||||||
|
@ -71,6 +71,18 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
return dto;
|
return dto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<UserRoleDto>> GetByNamesAsync(IEnumerable<string> names, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
if (names?.Any() != true)
|
||||||
|
return null;
|
||||||
|
var entities = await cacheUserRoles.WhereAsync(r => names.Contains(r.Caption), token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
if (entities?.Count() != names.Count())
|
||||||
|
throw new ArgumentException("Invalid role names", nameof(names));
|
||||||
|
var dtos = entities.Select(Convert);
|
||||||
|
return dtos;
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<int> UpdateAsync(int id, UserRoleDto dto, CancellationToken token = default)
|
public async Task<int> UpdateAsync(int id, UserRoleDto dto, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
if (dto.Id != id)
|
if (dto.Id != id)
|
||||||
|
@ -47,11 +47,21 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
public async Task<int> InsertAsync(UserExtendedDto dto, CancellationToken token = default)
|
public async Task<int> InsertAsync(UserExtendedDto dto, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
var entity = Convert(dto);
|
var entity = Convert(dto);
|
||||||
|
await AssertLoginAsync(dto.Login, token);
|
||||||
|
var userRoles = await RoleService.GetByNamesAsync(dto.RoleNames, token).ConfigureAwait(false);
|
||||||
var updatedEntity = await cacheUsers.InsertAsync(entity, token).ConfigureAwait(false);
|
var updatedEntity = await cacheUsers.InsertAsync(entity, token).ConfigureAwait(false);
|
||||||
await UpdateRolesCacheForUserAsync((int)updatedEntity.Id, dto.RoleNames, token);
|
if (userRoles?.Any() == true)
|
||||||
|
await UpdateRolesCacheForUserAsync(updatedEntity.Id, userRoles, token);
|
||||||
return updatedEntity?.Id ?? 0;
|
return updatedEntity?.Id ?? 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task AssertLoginAsync(string login, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
var existingUser = await cacheUsers.FirstOrDefaultAsync(u => u.Login.ToLower() == login.ToLower(), token);
|
||||||
|
if (existingUser is not null)
|
||||||
|
throw new ArgumentException($"Login {login} is busy by {existingUser.MakeDisplayName()}, id{existingUser.Id}", nameof(login));
|
||||||
|
}
|
||||||
|
|
||||||
public Task<int> InsertRangeAsync(IEnumerable<UserExtendedDto> newItems, CancellationToken token = default)
|
public Task<int> InsertRangeAsync(IEnumerable<UserExtendedDto> newItems, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
@ -66,7 +76,6 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
var dtos = entities.Select(Convert).ToList();
|
var dtos = entities.Select(Convert).ToList();
|
||||||
for (var i = 0; i < dtos.Count; i++)
|
for (var i = 0; i < dtos.Count; i++)
|
||||||
dtos[i].RoleNames = GetRolesNamesByIdUser(dtos[i].Id);
|
dtos[i].RoleNames = GetRolesNamesByIdUser(dtos[i].Id);
|
||||||
|
|
||||||
return dtos;
|
return dtos;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,12 +89,21 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
|
|
||||||
public async Task<int> UpdateAsync(int id, UserExtendedDto dto, CancellationToken token = default)
|
public async Task<int> UpdateAsync(int id, UserExtendedDto dto, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
|
var oldUser = await cacheUsers.FirstOrDefaultAsync(u=>u.Id == id, token);
|
||||||
|
if(oldUser.Login != dto.Login)
|
||||||
|
await AssertLoginAsync(dto.Login, token);
|
||||||
|
|
||||||
|
var userRoles = await RoleService.GetByNamesAsync(dto.RoleNames, token).ConfigureAwait(false);
|
||||||
|
await UpdateRolesCacheForUserAsync(id, userRoles, token);
|
||||||
|
|
||||||
var entity = Convert(dto);
|
var entity = Convert(dto);
|
||||||
await UpdateRolesCacheForUserAsync(id, dto.RoleNames, token);
|
if (dto.Id == 0)
|
||||||
|
entity.Id = id;
|
||||||
|
else if (dto.Id != id)
|
||||||
|
throw new ArgumentException($"Invalid userDto.id it mast be 0 or {id}", nameof(dto));
|
||||||
|
|
||||||
var result = await cacheUsers.UpsertAsync(entity, token)
|
var result = await cacheUsers.UpsertAsync(entity, token)
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,27 +138,17 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
return permissions;
|
return permissions;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task UpdateRolesCacheForUserAsync(int idUser, IEnumerable<string> newRoleNames, CancellationToken token)
|
private async Task UpdateRolesCacheForUserAsync(int idUser, IEnumerable<UserRoleDto> newRoles, CancellationToken token)
|
||||||
{
|
{
|
||||||
if (newRoleNames?.Any() != true)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var relatrions = new List<RelationUserUserRole>(newRoleNames.Count());
|
|
||||||
foreach (var roleName in newRoleNames)
|
|
||||||
{
|
|
||||||
var role = await RoleService.GetByNameAsync(roleName, token)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
if (role != null)
|
|
||||||
relatrions.Add(new()
|
|
||||||
{
|
|
||||||
IdUser = idUser,
|
|
||||||
IdUserRole = role.Id,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
await cacheRelationUserToRoles.RemoveAsync(r => r.IdUser == idUser, token)
|
await cacheRelationUserToRoles.RemoveAsync(r => r.IdUser == idUser, token)
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
await cacheRelationUserToRoles.InsertAsync(relatrions, token)
|
|
||||||
.ConfigureAwait(false);
|
if (newRoles?.Any() == true)
|
||||||
|
await cacheRelationUserToRoles.InsertAsync(newRoles.Select(role => new RelationUserUserRole
|
||||||
|
{
|
||||||
|
IdUser = idUser,
|
||||||
|
IdUserRole = role.Id
|
||||||
|
}), token).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool HasAnyRoleOf(int idUser, IEnumerable<string> roleNames)
|
public bool HasAnyRoleOf(int idUser, IEnumerable<string> roleNames)
|
||||||
@ -178,9 +186,8 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
protected virtual User Convert(UserExtendedDto dto)
|
protected virtual User Convert(UserExtendedDto dto)
|
||||||
{
|
{
|
||||||
var entity = dto.Adapt<User>(userTypeAdapterConfig);
|
var entity = dto.Adapt<User>(userTypeAdapterConfig);
|
||||||
var oldUser = new Lazy<User>(() => cacheUsers.FirstOrDefault(u => u.Id == dto.Id));
|
|
||||||
if (string.IsNullOrEmpty(entity.PasswordHash))
|
if (string.IsNullOrEmpty(entity.PasswordHash))
|
||||||
entity.PasswordHash = oldUser.Value.PasswordHash;
|
entity.PasswordHash = cacheUsers.FirstOrDefault(u => u.Id == dto.Id)?.PasswordHash;
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ namespace AsbCloudWebApi.Middlewares
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private string MakeJsonBody(ArgumentException ex)
|
private static string MakeJsonBody(ArgumentException ex)
|
||||||
{
|
{
|
||||||
object error = new { name = ex.ParamName, errors = new string[] { ex.Message } };
|
object error = new { name = ex.ParamName, errors = new string[] { ex.Message } };
|
||||||
var buffer = System.Text.Json.JsonSerializer.Serialize(error);
|
var buffer = System.Text.Json.JsonSerializer.Serialize(error);
|
||||||
|
Loading…
Reference in New Issue
Block a user