Exemple #1
0
        public async Task <Response <string> > RequestUpdatePasswordByToken(
            [MinLength(1)] string email,
            [FromServices] INotificator notificator)
        {
            _logger.LogInformation("Запрос на сброс пароля по email");

            var user = await _signInManager.UserManager.FindByEmailAsync(email.Trim());

            if (user != null)
            {
                var token = await _signInManager.UserManager.GeneratePasswordResetTokenAsync(user);

                notificator.NotifyAndForgot(new ResetPasswordMetadata(
                                                user.Email,
                                                token));
            }
            else
            {
                _logger.LogWarning($"Пользователь по email: \"{email}\" не найден. Письмо отправлено не будет.");
            }

            return(new Response <string>("Если в системе есть аккаунт с таким электронным адресом, мы вышлем вам инструкции по сбросу пароля"));
        }
        public async Task <Response> CreateOrUpdate(
            [FromBody] UserEditorModel model,
            [FromServices] UserManager <UserEntity> userManager,
            [FromServices] INotificator notificator)
        {
            UserEntity user;

            if (model.Id.HasValue)
            {
                user = await userManager.Users
                       .Where(x => x.Id == model.Id.Value)
                       .SingleOrDefaultAsync()
                       ?? throw new EntityNotFoundException($"Пользователь (id = {model.Id.Value}) не найден");
            }
            else
            {
                user = new UserEntity();
            }

            // часовой пояс
            if (!TimeZoneHelper.IsTimeZoneIdValid(model.TimeZoneId))
            {
                throw new InvalidRequestDataException("Не корректный часовой пояс");
            }

            user.TimeZoneId = model.TimeZoneId;

            // телефон
            if (!String.IsNullOrWhiteSpace(model.PhoneNumber))
            {
                if (!model.PhoneNumber.CleanupPhone().IsMobilePhoneFormat())
                {
                    throw new InvalidRequestDataException("Не корректный номер телефона", nameof(model.PhoneNumber));
                }

                user.PhoneNumber = model.PhoneNumber.ResolvePhoneTo7Format();
            }

            // email
            if (!model.Id.HasValue)
            {
                if (String.IsNullOrWhiteSpace(model.Email))
                {
                    throw new InvalidRequestDataException("Email обязателен для нового пользователя", nameof(model.Email));
                }

                user.Email    = model.Email;
                user.UserName = model.Email;
            }

            // восстановление пользователя
            if (!user.IsDeleted && user.IsDeleted)
            {
                user.IsDeleted = model.IsDeleted;
                _logger.LogInformation($"Восстанавливаем пользователя (Id = {user.Id}) из удалённых");
            }

            if (model.Id.HasValue)
            {
                // обновляем
                var result = await userManager.UpdateAsync(user);

                if (!result.Succeeded)
                {
                    throw new InvalidRequestDataException(result.Errors);
                }

                _logger.LogInformation($"Успешно обновлен пользователь (Id = {model.Id})");
            }
            else
            {
                // создаём
                var result = await userManager.CreateAsync(user);

                if (!result.Succeeded)
                {
                    throw new InvalidRequestDataException(result.Errors);
                }

                // для завершении регистрации пользователь должен задать пароль
                var token = await userManager.GeneratePasswordResetTokenAsync(user);

                notificator.NotifyAndForgot(new RegistrationMetadata(
                                                user.Email,
                                                token));

                _logger.LogInformation($"Успешно создан новый пользователь (Id = {user.Id}, email = {user.Email})");
            }

            return(new Response());
        }