public IActionResult PostUserQuiz([FromBody] QuizGrade request) { var attempt = new QuizAttempts { UserQuizId = request.UserQuizId, ScoreDate = DateTime.Now }; _repoWrapper.QuizAttempts.Create(attempt); _repoWrapper.QuizAttempts.Save(); return(Ok(new { attempt_id = attempt.Id })); }
public List <QuizAttempts> GetReflectionToolQuizAttempts(string userId, int attempt, QuizDetails quizDetails) { var reflectionToolQuizzes = _reflectionToolAdapter.GetReflectionToolQuestions(); var latestAttempt = _reflectionToolAdapter.GetLatestAttemptByUser(userId); List <ReflectionToolQuizAttempt> result = new List <ReflectionToolQuizAttempt>(); if (latestAttempt != null) { if (attempt == 1) { result = _reflectionToolAdapter.GetReflectionToolAttempts(userId, latestAttempt.attemptcount); } else { if (latestAttempt.attemptcount > 1) { _reflectionToolAdapter.GetReflectionToolAttempts(userId, latestAttempt.attemptcount - 1); } } } List <QuizAttempts> quizAttempts = new List <QuizAttempts>(); if (result != null) { foreach (var quizAttempt in result) { QuizAttempts attempts = new QuizAttempts { question = reflectionToolQuizzes.FirstOrDefault(q => q.id == quizAttempt.questionid)?.question, answer = quizAttempt.answer, userId = quizAttempt.userid, selectedoptions = string.Join(",", quizAttempt.selectedoptions), attempt = quizAttempt.attemptcount, type = quizDetails.type }; quizAttempts.Add(attempts); } } return(quizAttempts); }
public async Task <QuizValidationResponse> Handle(ValidateQuizCommand request, CancellationToken cancellationToken) { var lessonId = (await _context.Quizzes .AsNoTracking() .Where(x => x.Id == request.Id) .Include(x => x.Section) .FirstOrDefaultAsync(cancellationToken)).Section.LessonId; var quiz = await _context.Quizzes .AsNoTracking() .Where(x => x.Id == request.Id) .Include(x => x.Questions) .ThenInclude(y => y.Answers) .FirstOrDefaultAsync(cancellationToken); if (quiz == null) { throw new System.NotImplementedException(); } var response = new QuizValidationResponse(); foreach (var question in quiz.Questions) { response.MaxAttempts = quiz.MaxAttempts; response.Questions ??= new List <QuizValidationResponse.QuestionValidationResponse>(); var responseAnswers = question.Answers.Select(answer => new QuizValidationResponse.AnswerValidationResponse() { Id = answer.Id, Value = answer.Value, Wrong = request.Questions.Any(x => x.Answers.Any(y => y.Id == answer.Id && y.IsSelected != answer.IsCorrect)), IsSelected = request.Questions.Any(x => x.Answers.Any(y => y.Id == answer.Id && y.IsSelected)) }).ToList(); response.Questions.Add(new QuizValidationResponse.QuestionValidationResponse() { Id = question.Id, Type = question.Type, Value = question.Value, Score = question.Score, Answers = new List <QuizValidationResponse.AnswerValidationResponse>(responseAnswers), }); } var progress = await _context.Progresses .AsNoTracking() .Where(x => x.LessonId == lessonId && x.UserId == _currentUser.UserId) .FirstOrDefaultAsync(cancellationToken); if (response.Questions.All(x => x.Answers.All(y => y.Wrong == false))) { progress.Score = response.Questions.Sum(x => x.Score); _context.Progresses.Update(progress); } var attempt = await _context.UserQuizAttempts .AsNoTracking() .Where(x => x.UserId == _currentUser.UserId && x.QuizId == quiz.Id && x.ProgressId == progress.Id) .FirstOrDefaultAsync(cancellationToken); if (attempt == null) { attempt = new QuizAttempts { AttemptId = 1, ProgressId = progress.Id, QuizId = quiz.Id, UserId = _currentUser.UserId, Result = JsonConvert.SerializeObject(response) // TODO: JSON STRINGIFY }; response.MaxAttempts--; await _context.UserQuizAttempts.AddAsync(attempt, cancellationToken); } else { var count = _context.UserQuizAttempts.Count(x => x.UserId == _currentUser.UserId && x.QuizId == quiz.Id && x.ProgressId == progress.Id); if (count == quiz.MaxAttempts) { throw new NotImplementedException(); } if (count < quiz.MaxAttempts) { attempt = new QuizAttempts { AttemptId = count + 1, ProgressId = progress.Id, QuizId = quiz.Id, UserId = _currentUser.UserId, Result = JsonConvert.SerializeObject(response) // TODO: JSON STRINGIFY }; await _context.UserQuizAttempts.AddAsync(attempt, cancellationToken); response.MaxAttempts -= count + 1; } else { response.MaxAttempts = 0; } } await _context.SaveChangesAsync(cancellationToken); return(response); }