public void CreateAssessmentSubmission(AssessmentSubmission submission, out Certificate certificate) { if (submission == null) { throw new ArgumentNullException(nameof(submission)); } certificate = null; //TODO validation AssessmentRequest request = submission.AssessmentRequest ?? _assessmentRequests.GetById(submission.AssessmentRequestId); request.IsCompleted = true; _assessmentRequests.Update(request); _assessmentRequests.SaveChanges(); submission.UserId = request.UserId; _assessmentSubmissions.Add(submission); _assessmentSubmissions.SaveChanges(); Course submissionCourse = _courses.GetById(submission.CourseId); if (submission.IsSuccessful) { certificate = _certificatesService.GenerateCertificate(request.User.Username, submissionCourse.Id, submission); string certificateUrl = _routeProvider.GetCertificateRoute(certificate); string certificatePictureUrl = _routeProvider.GetCertificatePictureRoute(certificate); _messageService.SendExamSuccessfulMessage(request.User, submissionCourse, certificateUrl, certificatePictureUrl); } else { string assessmentUrl = _routeProvider.GetAssessmentRoute(submissionCourse.Id); _taskRunner.Schedule <IMessageService>(x => x.SendExamAvailableMessage(request.User, submissionCourse, assessmentUrl), NextAvailableAssessmentAttempt(submission.CreatedOn));//TODO add config setting } }