public async Task <IActionResult> PostUserAssessment([FromBody] UserAssessment userAssessment) { ModelState.Remove("User"); if (ModelState.IsValid) { var user = await GetCurrentUserAsync(); userAssessment.User = user; _context.UserAssessment.Add(userAssessment); } else { return(BadRequest(ModelState)); } try { await _context.SaveChangesAsync(); } catch (DbUpdateException) { if (UserAssessmentExists(userAssessment.UserAssessmentId)) { return(new StatusCodeResult(StatusCodes.Status409Conflict)); } else { throw; } } return(CreatedAtAction("GetUserAssessment", new { id = userAssessment.UserAssessmentId }, userAssessment)); }
public async Task <IActionResult> GetUserAssessment([FromRoute] int id) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } UserAssessment userAssessment = await _context.UserAssessment.SingleOrDefaultAsync(m => m.UserAssessmentId == id); if (userAssessment == null) { return(NotFound()); } return(Ok(userAssessment)); }
/// <summary> /// Save the response of an assessment including checked off Checkoff Items and Comment /// </summary> /// <param name="userid">hashed userid</param> /// <param name="ViewModel">Object containing Response data</param> /// <returns>ID of next Question in this Category (will loop to first Question at the end)</returns> public int SaveAnswer(string userid, ConductAssessmentViewModel ViewModel) { //Get the user's response to Question if exists (ie: they have answered this question already and are updating) var answer = db.UserAssessmentQuestions.SingleOrDefault(o => o.UserAssessmentCategory.UserAssessment.UserDetail.UserId == userid && o.AssessmentQuestionID == ViewModel.Question.ID); if (answer != null) //User has existing response { answer.Comments = ViewModel.Question.Comment; //Update the comment /* Get all the CheckoffItems for this user's previous response. * Most items will have (checked = true) because items not checked off are removed. */ var checkoffItems = answer.UserAssessmentCheckoffItems.ToList(); foreach (var item in ViewModel.Question.Levels.SelectMany(o => o.CheckoffItems)) //For each Checkoff Item in the NEW response { if (checkoffItems.Any(x => x.AssessmentCheckoffItemID == item.ID)) //User has checked this item off in previous response { if (item.Checked) //User has checked this item off in new response. Set Checked to true { db.UserAssessmentCheckoffItems.Single(o => o.AssessmentCheckoffItemID == item.ID).Checked = true; } else //User has not checked off this response item. Remove the record. { db.UserAssessmentCheckoffItems.Remove(checkoffItems.Single(o => o.AssessmentCheckoffItemID == item.ID)); } } else if (item.Checked) //Item did not exist in old response but is checked off in new response. Create new record. { db.UserAssessmentCheckoffItems.Add(new UserAssessmentCheckoffItem { AssessmentCheckoffItemID = item.ID, UserAssessmentQuestionID = answer.ID, Checked = true }); } } } else //User has not responded to this Question before { //Get a Checkoff Item ID to determine Question var checkoffitemid = ViewModel.Question.Levels.SelectMany(y => y.CheckoffItems).First().ID; //Find Question the CheckoffItem belongs to var question = db.AssessmentQuestions.Single(o => o.AssessmentCheckoffItems.Any(x => x.ID == checkoffitemid)); answer = new UserAssessmentQuestion { AssessmentQuestionID = question.ID, Comments = ViewModel.Question.Comment }; answer.UserAssessmentCheckoffItems = new List <UserAssessmentCheckoffItem>(); foreach (var item in ViewModel.Question.Levels.SelectMany(o => o.CheckoffItems)) { if (item.Checked) //Create record if Checkoff Item is checked. Skip if not checked. { answer.UserAssessmentCheckoffItems.Add(new UserAssessmentCheckoffItem { AssessmentCheckoffItemID = item.ID, Checked = true }); } } //Check if user this is the first Question the user has responded to in the Category (or Assessment) if (!question.AssessmentCategory.UserAssessmentCategories.Any(o => o.UserAssessment.UserDetail.UserId == userid)) //First time answering a Question in this Category { var AnswerAssessment = new UserAssessment(); var AnswerCategory = new UserAssessmentCategory { UserAssessmentQuestions = new List <UserAssessmentQuestion>(), AssessmentCategoryID = ViewModel.CategoryID }; answer.UserAssessmentCategoryID = AnswerCategory.ID; AnswerCategory.UserAssessmentQuestions.Add(answer); //Check if this is first Question answered in whole Assessment by this user if (!question.AssessmentCategory.AssessmentCollection.UserAssessments.Any(o => o.UserDetail.UserId == userid)) { //First Question answered in whole assessment. AnswerAssessment.UserDetailID = db.UserDetails.Single(o => o.UserId == userid).ID; AnswerAssessment.AssessmentID = question.AssessmentCategory.AssessmentCollectionID; AnswerAssessment.UserAssessmentCategories = new List <UserAssessmentCategory>(); AnswerAssessment.UserAssessmentCategories.Add(AnswerCategory); db.UserAssessments.Add(AnswerAssessment); } else { //First question in this category, but not the assessment AnswerAssessment = db.UserAssessments.Single(o => o.UserDetail.UserId == userid && o.AssessmentCollection.AssessmentCategories.Any(x => x.ID == ViewModel.CategoryID)); AnswerAssessment.UserAssessmentCategories.Add(AnswerCategory); } } else { //Not the first question responded to in this category. answer.UserAssessmentCategoryID = question.AssessmentCategory.UserAssessmentCategories.Single(o => o.UserAssessment.UserDetail.UserId == userid).ID; db.UserAssessmentQuestions.Add(answer); } } //Calculate score. See Documentation for how Score is calculated. answer.Score = ViewModel.Question.Levels.Any(o => o.LevelOrder == 1 && o.CheckoffItems.Any(x => x.Checked)) ? 1 : ViewModel.Question.Levels.Any(o => o.LevelOrder == 2 && o.CheckoffItems.Any(x => x.Checked)) ? 2 : (ViewModel.Question.Levels.Any(o => o.LevelOrder == 3 && o.CheckoffItems.Any(x => x.Checked)) && !ViewModel.Question.Levels.Any(y => y.LevelOrder == 4 && y.CheckoffItems.Any(z => z.Checked))) ? 3 : ViewModel.Question.Levels.Any(o => o.LevelOrder == 4 && o.CheckoffItems.Any(x => x.Checked)) ? 4 : 0; db.SaveChanges(); return(GetNextQuestionId(answer.AssessmentQuestionID)); }