/// <summary> /// Sends feedback for a particular submission. /// </summary> private async Task<Tuple<Submission, bool>> SendSubmissionFeedbackAsync( Submission submission, string fromAddress, Func<Submission, string> markReadUrlBuilder) { try { await _emailProvider.SendMessageAsync ( submission.Commit.User.EmailAddress, fromAddress, "CS Classroom", $"{submission.Checkpoint.Project.Name} {submission.Checkpoint.DisplayName} Feedback", $"{submission.Feedback.Replace("\n", "<br>")}<br><br><a href=\"{markReadUrlBuilder(submission)}\">Click here</a> to mark this feedback as read." ); return new Tuple<Submission, bool>(submission, true); } catch (Exception ex) { _logger.LogError ( 0, ex, "Failed to send e-mail to {emailAddress}", submission.Commit.User.EmailAddress ); return new Tuple<Submission, bool>(submission, false); } }
/// <summary> /// Submits a checkpoint. /// </summary> public async Task<Submission> SubmitCheckpointAsync( string classroomName, string projectName, string checkpointName, int userId, int commitId) { var checkpoint = await LoadCheckpointAsync ( classroomName, projectName, checkpointName ); var commit = await _dbContext.Commits .Where(c => c.Id == commitId) .Where(c => c.UserId == userId) .Include(c => c.Project.Classroom) .Include(c => c.User.ClassroomMemberships) .Include(c => c.Build.TestResults) .SingleOrDefaultAsync(); var pullRequestNumber = await _submissionCreator.CreatePullRequestAsync ( commit, checkpoint ); var submission = new Submission() { CheckpointId = checkpoint.Id, Checkpoint = checkpoint, CommitId = commit.Id, Commit = commit, DateSubmitted = _timeProvider.UtcNow, PullRequestNumber = pullRequestNumber }; _dbContext.Submissions.Add(submission); await _dbContext.SaveChangesAsync(); return submission; }