コード例 #1
0
        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());
            }
        }