Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }