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 }); }