public async Task <ContentCompletionModel> Get(int contentId, int userId) { var entity = await db.CourseContents .Include(x => x.Question.FreeTextAnswers) .Include(x => x.Question.MultipleChoiceAnswers) .FirstOrDefaultAsync(x => x.Id == contentId); var model = new ContentCompletionModel { CourseId = entity.CourseId, CourseModuleId = entity.CourseModuleId, ContentId = entity.Id, Title = entity.Title, }; if (entity.CompletionType == ContentCompletionType.Timer) { model.CompletionType = ContentCompletionType.Timer; model.Timer = entity.Timer; model.QuestionId = null; model.Question = null; } else if (entity.CompletionType == ContentCompletionType.ClickButton) { model.CompletionType = ContentCompletionType.ClickButton; model.QuestionId = null; model.Question = null; model.Timer = 0; } else if (entity.CompletionType == ContentCompletionType.AnswerQuestion) { model.CompletionType = ContentCompletionType.AnswerQuestion; model.Timer = 0; model.QuestionId = entity.Question.Id; } else { model.CompletionType = ContentCompletionType.ClickButton; model.QuestionId = null; model.Question = null; model.Timer = 0; } //// Get the user progress for this module. var course = await db.Courses.FirstOrDefaultAsync(x => x.Id == entity.CourseId); if (course?.Status == CourseStatus.Published) { var learner = await db.Learners.FirstOrDefaultAsync(x => x.User.Id == userId); if (learner != null) { var progress = await db.CourseProgress.FirstOrDefaultAsync(x => x.ContentId == contentId && x.LearnerId == learner.Id); if (progress?.IsCompleted == true) { model.IsCompleted = true; } } } return(model); }
public async Task <IHttpActionResult> Post(bool CanViewAsLearner, [FromBody] ContentCompletionModel request) { if (ModelState.IsValid) { var currentContent = db.CourseContents.Find(request.ContentId); var nextContent = await db.CourseContents.Where(x => x.Order > currentContent.Order && x.CourseModuleId == currentContent.CourseModuleId) .OrderBy(x => x.Order).FirstOrDefaultAsync(); if (nextContent != null) { request.nextContentId = nextContent.Id; request.nextModuleId = currentContent.CourseModuleId; } else { // get next module var currentModule = db.CourseModules.Find(currentContent.CourseModuleId); var nextModule = await db.CourseModules.Where(x => x.CourseId == request.CourseId && x.Order > currentModule.Order).OrderBy(x => x.Order).FirstOrDefaultAsync(); if (nextModule == null) { request.nextContentId = null; request.nextModuleId = null; } else { request.nextModuleId = nextModule.Id; request.nextContentId = null; } } // Check if Admin or non learner, if so, no need to keep progress if (CanViewAsLearner) { return(Ok(request)); } var course = await db.Courses.FindAsync(currentContent.CourseId); if (course != null & course.Status == CourseStatus.Published) { // get enrollment info var learner = await db.Learners.FirstOrDefaultAsync(x => x.UserId == request.UserId); if (learner == null) { db.ErrorLog.Add(new ErrorLog { ErrorDescription = "Learner not found to record progress.", ErrorDetails = $"Could not find learner with userid ={request.UserId} to record progress for course = { request.CourseId} ", Module = Modules.Learning, }); db.SaveChanges(); return(BadRequest()); } var enrollment = await db.Enrollments.FirstOrDefaultAsync(x => x.CourseId == request.CourseId && x.LearnerId == learner.Id && !x.CourseEvent.IsTrial && (x.Status == EnrollmentStatus.Enrolled || x.Status == EnrollmentStatus.Completed)); if (enrollment == null) { db.ErrorLog.Add(new ErrorLog { ErrorDescription = "Enrollment not found to record progress.", ErrorDetails = $"Could not find enrollment for userid ={request.UserId} to record progress for course = { request.CourseId} ", Module = Modules.Learning, }); db.SaveChanges(); return(BadRequest()); } var courseProgress = enrollment.CourseProgress.FirstOrDefault(x => x.ModuleId == currentContent.CourseModuleId && x.ContentId == request.ContentId && x.LearnerId == learner.Id); if (courseProgress == null) { courseProgress = new CourseProgress { EnrollmentId = enrollment.Id, CourseId = course.Id, IsCompleted = true, ContentId = request.ContentId, ModuleId = currentContent.CourseModuleId, LearnerId = learner.Id, }; db.CourseProgress.Add(courseProgress); } else { courseProgress.ModuleId = currentContent.CourseModuleId; courseProgress.CourseId = currentContent.CourseId; courseProgress.IsCompleted = true; db.SetModified(courseProgress); } await db.SaveChangesAsync(); // calculate progress. var progressCount = db.CourseProgress.Where(x => x.EnrollmentId == enrollment.Id).Count(); course.UpdateCourseStat(); var totalContent = course.TotalContents; var progressPercent = ((decimal)progressCount / (decimal)totalContent) * 100m; enrollment.TotalContentsCompleted = progressCount; enrollment.PercentageCompleted = progressPercent; if ((request.nextContentId == null && request.nextModuleId == null) || enrollment.TotalContentsCompleted == totalContent) { enrollment.Status = EnrollmentStatus.Completed; enrollment.CompletionDate = DateTime.Now; } db.SetModified(enrollment); await db.SaveChangesAsync(); request.CourseId = course.Id; return(Ok(request)); } else { return(BadRequest()); } } else { return(BadRequest(ModelState)); } }
public async Task <ActionResult> Post(ContentCompletionModel model) { bool CanViewAsLearner = false; if (CurrentUser.HasAccess(UserAccess.CourseCreate) || CurrentUser.HasAccess(UserAccess.CourseEdit) || CurrentUser.HasAccess(UserAccess.CourseVerify) || CurrentUser.HasAccess(UserAccess.CourseApproval1) || CurrentUser.HasAccess(UserAccess.CourseApproval2) || CurrentUser.HasAccess(UserAccess.CourseApproval3) || CurrentUser.HasAccess(UserAccess.CourseDiscussionCreate)) { CanViewAsLearner = true; } if (ModelState.IsValid) { model.UserId = CurrentUser.UserId.Value; var response = await WepApiMethod.SendApiAsync <ContentCompletionModel>(HttpVerbs.Post, ContentCompletionsApiUrl.Post + $"?CanViewAsLearner={CanViewAsLearner}", model); if (response.isSuccess) { //TempData["SuccessMessage"] = "Content Completed"; await LogActivity(Modules.Learning, $"User : {CurrentUser?.Name} complete this content : {model.Title}"); var nextContent = response.Data.nextContentId; var nextModule = response.Data.nextModuleId; var courseId = response.Data.CourseId; if (nextContent == null) { if (nextModule == null) // No more module and content, lets go to the course page { TempData["SuccessMessage"] = "Congratulations, you have completed this course."; var course = await CoursesController.TryGetFrontCourse(courseId.Value); if (course.Status != Model.eLearning.CourseStatus.Published) { if (CurrentUser.HasAccess(UserAccess.CourseCreate)) { return(RedirectToAction("Content", "Courses", new { area = "eLearning", @id = courseId })); } else if (CurrentUser.HasAccess(UserAccess.CourseNonLearnerView)) { return(RedirectToAction("Approve", "CourseApprovals", new { area = "eLearning", @id = courseId })); } } else if (course.Status == Model.eLearning.CourseStatus.Published) { if (CurrentUser.HasAccess(UserAccess.CourseCreate)) { return(RedirectToAction("Content", "Courses", new { area = "eLearning", @id = courseId })); } else if (CurrentUser.HasAccess(UserAccess.CourseNonLearnerView)) { return(RedirectToAction("Content", "Courses", new { area = "eLearning", @id = courseId })); } else { return(RedirectToAction("View", "Courses", new { area = "eLearning", @id = courseId })); } } return(RedirectToAction("View", "Courses", new { area = "eLearning", @id = courseId })); } else // go to next module { return(RedirectToAction("View", "CourseModules", new { area = "eLearning", @id = nextModule.Value })); } } else // go to next content { return(RedirectToAction("View", "CourseContents", new { area = "eLearning", @id = nextContent.Value })); } } } TempData["ErrorMessage"] = "Cannot complete content."; return(RedirectToAction("Content", "CourseModules", new { area = "eLearning", @id = model.CourseModuleId })); }