private async Task <ReplaceResultResponse> ReplaceResultAsync(ReplaceResultRequest request) { var response = new ReplaceResultResponse(); var ltiRequest = await Request.ParseLtiRequestAsync(); var signature = ltiRequest.GenerateSignature("secret"); if (!ltiRequest.Signature.Equals(signature)) { response.StatusCode = StatusCodes.Status401Unauthorized; return(response); } if (_result == null) { _result = new Result(); } if (_result == null) { return(response); } _result.Score = request.Result.Score; _result.SourcedId = request.Result.SourcedId; return(response); }
private async Task <ReplaceResultResponse> ReplaceResultAsync(ReplaceResultRequest request) { var response = new ReplaceResultResponse(); var ltiRequest = await Request.ParseLtiRequestAsync(); var signature = ltiRequest.GenerateSignature("secret"); if (!ltiRequest.Signature.Equals(signature)) { response.StatusCode = StatusCodes.Status401Unauthorized; return(response); } if (_result == null) { _result = new Result(); } if (_result == null) { return(response); } _result.Score = request.Result.Score; _result.SourcedId = request.Result.SourcedId; // Optional fields supported by Canvas _result.LtiLaunchUrl = request.Result.LtiLaunchUrl; _result.Text = request.Result.Text; _result.Url = request.Result.Url; return(response); }
private async Task <ReplaceResultResponse> ReplaceResultAsync(ReplaceResultRequest arg) { // Authenticate the LTI Request var response = new ReplaceResultResponse(); var ltiRequest = await Request.ParseLtiRequestAsync(); var signature = ltiRequest.GenerateSignature("secret"); if (!ltiRequest.Signature.Equals(signature)) { response.StatusCode = StatusCodes.Status401Unauthorized; return(response); } // Lookup the "offline" TokenResponse for the TeacherId var lisResultSourcedId = JsonConvert.DeserializeObject <LisResultSourcedId>(arg.Result.SourcedId); var googleUser = await Db.GoogleUsers.FindAsync(lisResultSourcedId.TeacherId); var appFlow = new AppFlowMetadata(ClientId, ClientSecret, Db); var token = await appFlow.Flow.LoadTokenAsync(googleUser.UserId, CancellationToken.None); // Using the TokenResponse, create a UserCredential for the teacher var credential = new UserCredential(appFlow.Flow, googleUser.UserId, token); // Using the teacher's UserCredential, create an instance of the ClassroomService using (var classroomService = new ClassroomService(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "gc2lti" })) { // Using the ClassroomService, get the CourseWork for the assignment var courseWorkRequest = classroomService.Courses.CourseWork.Get ( lisResultSourcedId.CourseId, lisResultSourcedId.CourseWorkId ); var courseWork = await courseWorkRequest.ExecuteAsync(); // Then get the student's StudentSubmission var submissionsRequest = classroomService.Courses.CourseWork.StudentSubmissions.List ( lisResultSourcedId.CourseId, lisResultSourcedId.CourseWorkId ); submissionsRequest.UserId = lisResultSourcedId.StudentId; var submissionsResponse = await submissionsRequest.ExecuteAsync(); if (submissionsResponse.StudentSubmissions == null) { response.StatusCode = StatusCodes.Status404NotFound; response.StatusDescription = "Submission was not found."; return(response); } var submission = submissionsResponse.StudentSubmissions.FirstOrDefault(); // Set the AssignedGrade and DraftGrade if (submission == null) { response.StatusCode = StatusCodes.Status404NotFound; response.StatusDescription = "Submission was not found."; } else { submission.AssignedGrade = arg.Result.Score * courseWork.MaxPoints; submission.DraftGrade = submission.AssignedGrade; var patchRequest = classroomService.Courses.CourseWork.StudentSubmissions.Patch ( submission, submission.CourseId, submission.CourseWorkId, submission.Id ); patchRequest.UpdateMask = "AssignedGrade,DraftGrade"; await patchRequest.ExecuteAsync(); response.StatusDescription = $"Score={arg.Result.Score}, AssignedGrade={submission.AssignedGrade}."; } } return(response); }