public Question GetNextQuestion(HomeworkState state,int userId) { List<int> solvedQuestionIdList = GetSolvedQuestionIdList(state.SubjectId,userId); List<Question> questionList = _questionDb.GetQuestionListBySubjectId(state.SubjectId); List<Question> unSolvedQuestionList = questionList.Where(question => !solvedQuestionIdList.Contains(question.id)).ToList() ; if(!unSolvedQuestionList.Any()) { throw new UnSolvedQuestionNotFoundException(); } return unSolvedQuestionList.First(); }
// TODO: copy contructor in c#? huh? public HomeworkState(HomeworkState state) { IndexOfBaseSubject = state.IndexOfBaseSubject; BaseSubjectId = state.BaseSubjectId; SubjectId = state.SubjectId; Direction = state.Direction; QuestionNumber = state.QuestionNumber; HomeworkId = state.HomeworkId; Mark = state.Mark; UserId = state.UserId; }
//updaUserState: // private void UpdateUserState(HomeworkState state) { RemoveUserState(state.UserId, state.HomeworkId); //add new state _homeworkStateDb.DbSet.Add(state); _homeworkStateDb.SaveChanges(); }
//CreateUserState // private void CreateUserState(HomeworkState state) { _homeworkStateDb.DbSet.Add(state); _homeworkStateDb.SaveChanges(); }
public ActionResult SolveHomework(int baseSubjectIndex,int subjectId, int homeworkId) { int userId = _userDb.GetUserIdByUsername(User.Identity.Name); if (IsHomeworkSolved(homeworkId, userId)) { return RedirectToAction("HomeworkSolved", new {homeworkId }); } //send First parameters to start homeWork HomeworkState newState=new HomeworkState(userId,baseSubjectIndex,subjectId,subjectId,0,0,homeworkId,0); //if state exist ,update else create if (IsUserStateExist(newState.UserId, newState.HomeworkId)) { UpdateUserState(newState); } else { CreateUserState(newState); } return RedirectToAction("HomeworkFirstStage",new {homeworkId}); }
//HomeWorkLastStage //in LastStage: we give questions with solution public ActionResult HomeWorkLastStage(int homeworkId) { ViewBag.homeworkId = homeworkId; int userId = _userDb.GetUserIdByUsername(User.Identity.Name); HomeworkState state = GetUserState(userId, homeworkId); HomeworkState nextState = new HomeworkState(GetUserState(userId, homeworkId)); if (_algorithm.MaxNumberOfStageQuestion <= state.QuestionNumber) { state.Mark = 0; UpdateUserState(state); return RedirectToAction("HomeWorkFirstStage",new{homeworkId}); } ViewBag.question = _algorithm.GetNextQuestion(state,userId); nextState.QuestionNumber++; UpdateUserState(nextState); return View(); }
//GET: HomeworkFirstStage: //when we go down in tree subject we will be in FirstStage //otherWise we are in LastStage public ActionResult HomeworkFirstStage(int homeworkId) { ViewBag.homeworkId = homeworkId; int userId = _userDb.GetUserIdByUsername(User.Identity.Name); HomeworkState state = GetUserState(userId, homeworkId); HomeworkState nextState = new HomeworkState(GetUserState(userId,homeworkId)); //update mark,and check if we need to go to children subject if (_algorithm.IsGoDown(ref nextState)) { List<int> subjectChildrenIds = _subjectDb.GetChildren(state.SubjectId); try { nextState.SubjectId = GetAvailableSubject(subjectChildrenIds); nextState.Mark = 0; nextState.QuestionNumber = 0; } catch(SubjectNotFoundException) { return RedirectToAction("HomeworkMaterial", new { state.HomeworkId }); } } else { //check if we Finish the current Level, and go Up. if (state.QuestionNumber >= _algorithm.MaxNumberOfStageQuestion) { //if we get to the base subject mean we finish Exam if (state.SubjectId == state.BaseSubjectId) { return RedirectToAction("PreSolveHomeWork", new{baseSubjectIndex = state.IndexOfBaseSubject+1, homeWorkId = state.HomeworkId}); } else { nextState.SubjectId = _subjectDb.GetSubjectParentId(state.SubjectId); nextState.Mark = -100; //TODO: need to change that we fail UpdateUserState(nextState); return RedirectToAction("HomeworkFirstStage", new { state.HomeworkId }); } } } //continue with the next state. ViewBag.question = _algorithm.GetNextQuestion(nextState, userId); nextState.QuestionNumber++; UpdateUserState(nextState); return View(); }
public bool IsGoDown(ref HomeworkState state) { // TODO: why ref? you're not changing the variable state. return (state.Mark < -3) ; }
public void UpdateMark(ref HomeworkState state, int questionId, string userAnswer) { Question question = _questionDb.GetQuestionById(questionId); int questionSign = (question.correctAnswerNum == userAnswer)? 1 : -1; // if the answer right add the level number to mark other sub level number from mark state.Mark += questionSign*question.level; }