public async Task UpdateAsync(UserModel user, bool force = false) { var applicationUser = await _userManager.FindByIdAsync(user.Id.ToString()); if (applicationUser is null) { throw new UserException(HttpStatusCode.BadRequest, new List <string> { ExceptionsInfo.InvalidId }); } if (string.IsNullOrEmpty(user.FirstName)) { user.Errors.Add(ExceptionsInfo.InvalidFirstName); } if (string.IsNullOrEmpty(user.LastName)) { user.Errors.Add(ExceptionsInfo.InvalidLastName); } if (user.PhoneNumber is null) { user.Errors.Add(ExceptionsInfo.InvalidPhone); } if (string.IsNullOrEmpty(user.NickName)) { user.Errors.Add(ExceptionsInfo.InvalidNickname); } applicationUser.UserName = user.NickName; applicationUser.FirstName = user.FirstName; applicationUser.LastName = user.LastName; applicationUser.PhoneNumber = user.PhoneNumber; applicationUser.IsBlocked = user.IsBlocked ?? default; if (applicationUser.Email != user.Email) { if (await _userManager.FindByEmailAsync(user.Email) != null) { throw new UserException(HttpStatusCode.BadRequest, new List <string> { ExceptionsInfo.EmailAlreadyTaken }); } string code = await _userManager.GenerateChangeEmailTokenAsync(applicationUser, user.Email); if (!force) { await _emailProvider.SendEmailChangeMessageAsync(applicationUser.Id, user.Email, code); } else { await _userManager.ChangeEmailAsync(applicationUser, user.Email, code); } } if (!string.IsNullOrEmpty(user.Password)) { string code = await _userManager.GeneratePasswordResetTokenAsync(applicationUser); await _userManager.ResetPasswordAsync(applicationUser, code, user.Password); } if (user.Errors.Any()) { throw new UserException(HttpStatusCode.BadRequest, user.Errors); } var result = await _userManager.UpdateAsync(applicationUser); var userNameError = result.Errors.FirstOrDefault(item => item.Code == "DuplicateUserName"); if (userNameError != null) { userNameError.Description = $"Nickname {user.NickName} is already taken"; } if (!result.Succeeded) { throw new UserException(HttpStatusCode.BadRequest, result.Errors.Select(error => error.Description).ToList()); } }