Beispiel #1
0
        private async Task SaveAnswers(QuestionAnswerDto answer)
        {
            CourseInstanceQuestion courseInstanceQuestionEntity = await _context.FindAsync <CourseInstanceQuestion>(answer.IdCourseInstanceQuestion);

            //Check if already answered.
            if (courseInstanceQuestionEntity.AnsweredAt.HasValue && courseInstanceQuestionEntity.AnswerShown)
            {
                return;
            }

            IList <CourseInstanceQuestionOption> options = await _context.CourseInstancesQuestionOption
                                                           .Where(x => x.CourseInstanceQuestion.Id == courseInstanceQuestionEntity.Id)
                                                           .OrderBy(x => x.Id)
                                                           .Include(x => x.QuestionOption).ToListAsync();

            if (options.Count != answer.Answers.Count)
            {
                throw new InvalidOperationException($"Num options in client-answer and database do not match");
            }
            for (int i = 0; i < options.Count; i++)
            {
                CourseInstanceQuestionOption optionInstanceEntity = options[i];
                bool thisAnswer    = answer.Answers[i];
                bool optioncorrect = optionInstanceEntity.QuestionOption.IsTrue == thisAnswer;

                optionInstanceEntity.Checked = thisAnswer;
                optionInstanceEntity.Correct = optioncorrect;
            }
            courseInstanceQuestionEntity.Correct    = options.All(x => x.Correct);
            courseInstanceQuestionEntity.AnsweredAt = DateTime.Now;

            await SaveChangesAsync();
        }
Beispiel #2
0
        private async Task <CourseInstanceDto> GetNextQuestion(CourseInstance courseInstanceEntity)
        {
            CourseInstanceDto result = new CourseInstanceDto();

            result.IdCourse         = courseInstanceEntity.IdCourse;
            result.IdCourseInstance = courseInstanceEntity.Id;

            Course courseEntity = await _context.FindAsync <Course>(courseInstanceEntity.IdCourse);

            result.NumQuestionsAlreadyAsked = await _context.CourseInstancesQuestion.Where(x => x.CourseInstance.Id == courseInstanceEntity.Id)
                                              .CountAsync();

            result.NumQuestionsTotal = courseEntity.NumQuestionsToAsk;

            //Possible Quetions Query
            IQueryable <int> questionIds = PossibleQuestionsQuery(courseInstanceEntity.Id, courseEntity.Language);

            int count = await questionIds.CountAsync();

            if (count == 0 || result.NumQuestionsAlreadyAsked >= courseEntity.NumQuestionsToAsk)
            {
                result.IdCourseInstanceQuestion = 0;
                result.NumQuestionsTotal        = result.NumQuestionsAlreadyAsked;
                result.Done = true;
                await EndCourseAsync(courseInstanceEntity.Id);
            }
            else
            {
                if (count <= result.NumQuestionsTotal - result.NumQuestionsAlreadyAsked)
                {
                    result.NumQuestionsTotal = result.NumQuestionsAlreadyAsked + count;
                }
                int quesitonNo = _random.Next(0, count - 1);
                int questionId = await questionIds.Skip(quesitonNo).FirstAsync();

                Question questionEntity = await _context.FindAsync <Question>(questionId);

                //Course instance question
                CourseInstanceQuestion courseInstanceQuestionEntity = new CourseInstanceQuestion
                {
                    CourseInstance = courseInstanceEntity,
                    Question       = questionEntity,
                    Number         = result.NumQuestionsAlreadyAsked + 1,
                };
                await _context.AddAsync(courseInstanceQuestionEntity);

                //Course instance question options
                IList <QuestionOption> options = await _context.QuestionOptions.Where(option => option.Question.Id == questionEntity.Id).ToListAsync();

                foreach (QuestionOption questionOptionEntity in options)
                {
                    CourseInstanceQuestionOption courseInstanceQuestionOptionEntity = new CourseInstanceQuestionOption();

                    courseInstanceQuestionOptionEntity.QuestionOption = questionOptionEntity;

                    courseInstanceQuestionOptionEntity.CourseInstanceQuestion = courseInstanceQuestionEntity;
                    courseInstanceQuestionEntity.CourseInstancesQuestionOption.Add(courseInstanceQuestionOptionEntity);

                    await _context.AddAsync(courseInstanceQuestionOptionEntity);
                }

                await SaveChangesAsync();

                result.IdCourseInstanceQuestion = courseInstanceQuestionEntity.Id;
            }


            return(result);
        }