public async Task <IActionResult> Update(Guid id, [FromBody] AdminUpdateUserDto adminUpdateUserDto) { adminUpdateUserDto.Id = id; var result = await _unitOfWork.UserService.UpdateProfile(adminUpdateUserDto); if (!result.Success) { return(result.ApiResult); } return(NoContent()); }
public async Task <Result> UpdateProfile(AdminUpdateUserDto adminUpdateUserDto) { var user = await FirstOrDefaultAsync(u => u.Id == adminUpdateUserDto.Id, u => u.UserWallet, u => u.UserInRoles.Select(ur => ur.Role)); if (user == null) { return(Result.Failed(new NotFoundObjectResult(new ApiMessage { Message = ResponseMessage.UserNotFound }))); } _mapper.Map(adminUpdateUserDto, user); if (!user.UserInRoles.Select(g => g.RoleId).SequenceEqual(adminUpdateUserDto.Roles)) { // get all roles that are removed var removeRoles = user.UserInRoles .Where(ur => !adminUpdateUserDto.Roles.Contains(ur.RoleId)).ToList(); if (removeRoles.Any()) { Context.UserInRoles.RemoveRange(removeRoles); } // get all roles id that are added var addedRolesId = adminUpdateUserDto.Roles.Where(roleId => !user.UserInRoles.Select(u => u.RoleId).Contains(roleId)).ToList(); var addedRoles = await Context.Roles.Where(u => addedRolesId.Contains(u.Id)).ToListAsync(); // if invalid role id sent if (addedRoles.Count != addedRolesId.Count) { return(Result.Failed(new BadRequestObjectResult(new ApiMessage { Message = ResponseMessage.RoleNotFound }))); } var addedUserRoles = addedRoles.Select(role => new UserInRole { Id = Guid.NewGuid(), Role = role, User = user }).ToList(); if (addedUserRoles.Any()) { await Context.UserInRoles.AddRangeAsync(addedUserRoles); } user.UserInRoles = addedUserRoles.Union(user.UserInRoles.Where(ur => !addedRolesId.Contains(ur.RoleId) && !removeRoles.Select(rr => rr.RoleId).Contains(ur.RoleId))) .ToList(); } // if (!string.IsNullOrEmpty(adminUpdateUserDto.Password)) // user.Password = StringUtil.HashPass(adminUpdateUserDto.Password); await Context.SaveChangesAsync(); return(Result.SuccessFull()); }