internal override async Task <User> UpdateUser(string username, UserUpdateData updateData) { var transaction = _context.Database.BeginTransaction(); try { IdentityUser identityUser = await _userManager.FindByNameAsync(username); if (null != updateData.Username) { var result = await _userManager.SetUserNameAsync(identityUser, updateData.Username); if (!result.Succeeded) { throw new ConduitServerException($"Failed to update username of user with username {username}"); } } if (null != updateData.Email) { var result = await _userManager.SetEmailAsync(identityUser, updateData.Email); if (!result.Succeeded) { throw new ConduitServerException($"Failed to update email of user with username {username}"); } } if (null != updateData.Password) { var passwordHash = _userManager.PasswordHasher.HashPassword(identityUser, updateData.Password); identityUser.PasswordHash = passwordHash; var result = await _userManager.UpdateAsync(identityUser); if (!result.Succeeded) { throw new ConduitServerException($"Failed to update password of user with username {username}"); } } if (null != updateData.Bio) { _userPersonalizationRepository.UpdateUserBio(identityUser.Id, updateData.Bio); } if (null != updateData.Image) { _userPersonalizationRepository.UpdateUserImage(identityUser.Id, updateData.Image); } _context.SaveChanges(); transaction.Commit(); UserPersonalizationDAO userPersonalizationDTO = _userPersonalizationRepository.GetUserPersonalization(identityUser.Id); return(new User(identityUser.Email, GenerateJWTToken(identityUser), identityUser.UserName, userPersonalizationDTO.Bio, userPersonalizationDTO.Image)); } catch (Exception ex) { transaction.Rollback(); throw ex; } }