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(); }
public async Task <CourseInstanceDto> AnswerQuestionAndGetNextQuestionAsync(QuestionAnswerDto answer) { await SaveAnswers(answer); //Nächste Frage vorbereiten. CourseInstanceQuestion courseInstanceQuestionEntity = await _context.FindAsync <CourseInstanceQuestion>(answer.IdCourseInstanceQuestion); CourseInstance courseInstanceEntity = await _context.FindAsync <CourseInstance>(courseInstanceQuestionEntity.IdCourseInstance); CourseInstanceDto result = await GetNextQuestion(courseInstanceEntity); result.AnsweredCorrectly = courseInstanceQuestionEntity.Correct; return(result); }
public async Task <QuestionDto> AnswerQuestionAndGetSolutionAsync(QuestionAnswerDto answer) { await SaveAnswers(answer); int questionId = await _context.CourseInstancesQuestion.Where(x => x.Id == answer.IdCourseInstanceQuestion) .Select(x => x.Question.Id).SingleAsync(); CourseInstanceQuestion courseInstanceQuestion = await _context.FindAsync <CourseInstanceQuestion>(answer.IdCourseInstanceQuestion); courseInstanceQuestion.AnswerShown = true; await SaveChangesAsync(); return(await _questionService.GetQuestionAsync(questionId)); }
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); }