Ejemplo n.º 1
0
        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);
        }