Exemplo n.º 1
0
        public async Task <ActionResult <PostUserAttempt.Response> > Post([FromBody] PostUserAttempt.Request request)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            AddUserAttemptResult addUserAttemptResult = await _addUserAttemptHandler.Handle(
                new AddUserAttemptParams
            {
                UserId      = request.UserId.Value,
                SecretValue = request.SecretValue.Value
            });

            if (addUserAttemptResult.ResultType == AddUserAttemptResult.Type.Success)
            {
                return(StatusCode(201, new PostUserAttempt.Response {
                    IsSuccess = true
                }));
            }

            return(StatusCode(201, new PostUserAttempt.Response {
                IsSuccess = false, ErrorMessage = addUserAttemptResult.ResultType.ToString()
            }));
        }
Exemplo n.º 2
0
        public async Task <AddUserAttemptResult> Handle(AddUserAttemptParams addUserAttemptParams)
        {
            ICollection <Setting> settings = await _settingsRepository.GetSettings();

            // 1. Validate attempts count
            Setting enterSecretNumberAttemptsCountSetting = settings.Single(t => t.Name == SettingName.EnterSecretNumberAttemptsCount);
            int     userAttemptsCount = (await _userAttemptRepository.GetUserAttempts(addUserAttemptParams.UserId)).Count;

            if (userAttemptsCount > enterSecretNumberAttemptsCountSetting.IntValue)
            {
                return(new AddUserAttemptResult(AddUserAttemptResult.Type.AttemptsCountExceeded));
            }

            // 2. Validate value against range
            Setting secretMinValueSetting = settings.Single(t => t.Name == SettingName.SecretRangeMinValue);

            if (addUserAttemptParams.SecretValue < secretMinValueSetting.IntValue)
            {
                return(new AddUserAttemptResult(AddUserAttemptResult.Type.LessThanRangeMinValue));
            }

            Setting secretMaxValueSetting = settings.Single(t => t.Name == SettingName.SecretRangeMaxValue);

            if (addUserAttemptParams.SecretValue < secretMinValueSetting.IntValue)
            {
                return(new AddUserAttemptResult(AddUserAttemptResult.Type.MoreThanRangeMaxValue));
            }

            // 3. Validate entered secret value
            AddUserAttemptResult result = null;

            Setting secretValueSetting = settings.Single(t => t.Name == SettingName.SecretValue);

            if (addUserAttemptParams.SecretValue == secretValueSetting.IntValue)
            {
                result = new AddUserAttemptResult(AddUserAttemptResult.Type.IncorrectValue);
            }
            else
            {
                result = new AddUserAttemptResult(AddUserAttemptResult.Type.Success);
            }

            // 4. Log user attempt to database
            UserAttempt userAttempt = new UserAttempt
            {
                UserId             = addUserAttemptParams.UserId,
                DateTimeUtc        = DateTime.UtcNow,
                EnteredSecretValue = addUserAttemptParams.SecretValue,
                IsSuccess          = result.ResultType == AddUserAttemptResult.Type.Success
            };
            await _userAttemptRepository.AddUserAttempt(userAttempt);

            return(result);
        }