예제 #1
0
        public async Task <IActionResult> AnswerTheQuestion(long learningQuizId, LearningQuizUserAnswer userAnswer)
        {
            var userId = UserId ?? await _usersService.GetAnonymousUserId(Request);

            var result = await _learningQuizzesService.AnswerQuestion(learningQuizId, userAnswer, userId);

            if (result == null)
            {
                return(BadRequest());
            }
            return(Ok(result));
        }
        public async Task <object> AnswerQuestion(long learningQuizId, LearningQuizUserAnswer userAnswer, string userId)
        {
            var learningQuiz = await _learningQuizzesRepository.GetById(learningQuizId);

            if (learningQuiz?.QuizId == null || learningQuiz.UserId != userId)
            {
                return(null);
            }

            var questionReoccurrences = await _learningQuizQuestionsRepository
                                        .GetAllByLearningQuizId(learningQuizId : learningQuizId, asNoTracking : false)
                                        .Where(q => q.QuestionId == userAnswer.QuizQuestionId)
                                        .SingleOrDefaultAsync();

            if (questionReoccurrences == null)
            {
                return(null);
            }

            var correctAnswers = await _answersRepository
                                 .GetAllByQuestionId(userAnswer.QuizQuestionId, learningQuiz.CreationTime, true)
                                 .Include(a => a.Versions)
                                 .Select(a => new {
                a.Id,
                a.Versions
                .Where(b => b.CreationTime <= learningQuiz.CreationTime)
                .OrderByDescending(b => b.CreationTime)
                .FirstOrDefault()
                .IsCorrect
            })
                                 .Where(a => a.IsCorrect)
                                 .Select(i => i.Id)
                                 .OrderBy(i => i)
                                 .ToListAsync();

            var selectedAnswers = userAnswer.SelectedAnswers
                                  .OrderBy(i => i)
                                  .ToList();

            var settings = await _userSettingsRepository.GetByIdOrDefault(userId);

            var isCorrect = correctAnswers.SequenceEqual(selectedAnswers);

            if (isCorrect)
            {
                ++learningQuiz.NumberOfCorrectAnswers;
                --questionReoccurrences.Reoccurrences;
                ++questionReoccurrences.GoodUserAnswers;
                if (questionReoccurrences.Reoccurrences == 0)
                {
                    learningQuiz.NumberOfLearnedQuestions = learningQuiz.NumberOfLearnedQuestions + 1;
                }
            }
            else
            {
                ++learningQuiz.NumberOfBadAnswers;
                questionReoccurrences.Reoccurrences += settings.ReoccurrencesIfBad;
                ++questionReoccurrences.BadUserAnswers;
                if (questionReoccurrences.Reoccurrences > settings.MaxReoccurrences)
                {
                    questionReoccurrences.Reoccurrences = settings.MaxReoccurrences;
                }
            }

            _learningQuizQuestionsRepository.Update(questionReoccurrences);
            _learningQuizzesRepository.Update(learningQuiz);
            await Context.SaveChangesAsync();

            var isUnfinished = await _learningQuizQuestionsRepository
                               .GetAllByLearningQuizId(learningQuizId)
                               .Where(q => q.Reoccurrences > 0)
                               .AnyAsync();

            if (!isUnfinished)
            {
                await SetAsFinished(learningQuizId);
            }

            return(new {
                IsFinished = !isUnfinished,
                IsCorrect = isCorrect,
                CorrectAnswers = correctAnswers,
                SelectedAnswers = selectedAnswers,
                questionReoccurrences.Reoccurrences,
                LearningQuiz = learningQuiz
            });
        }