private async Task <IActionResult> HandleReplaceResultRequest(imsx_RequestHeaderInfoType requestHeader, imsx_POXBodyType requestBody) { var replaceRequest = requestBody.Item as replaceResultRequest ?? new replaceResultRequest(); var result = GetResult(replaceRequest.resultRecord); try { var dto = new ReplaceResultDto(result); await OnReplaceResult(dto); if (dto.StatusCode == StatusCodes.Status200OK) { return(CreateSuccessResponse(replaceRequest, requestHeader.imsx_messageIdentifier, $"Score for {replaceRequest.resultRecord.sourcedGUID.sourcedId} is now {replaceRequest.resultRecord.result.resultScore.textString}")); } return(StatusCode(dto.StatusCode)); } catch (Exception ex) { return(StatusCode(StatusCodes.Status500InternalServerError, ex)); } }
private async Task <IActionResult> HandleDeleteResultRequest(imsx_RequestHeaderInfoType requestHeader, imsx_POXBodyType requestBody) { var deleteRequest = requestBody.Item as deleteResultRequest ?? new deleteResultRequest(); var deleteResponse = new deleteResultResponse(); var result = GetResult(deleteRequest.resultRecord); try { var dto = new DeleteResultDto(result.SourcedId); await OnDeleteResult(dto); if (dto.StatusCode == StatusCodes.Status200OK) { return(CreateSuccessResponse(deleteResponse, requestHeader.imsx_messageIdentifier, $"Score for {result.SourcedId} is deleted")); } return(StatusCode(dto.StatusCode)); } catch (Exception ex) { return(StatusCode(StatusCodes.Status500InternalServerError, ex)); } }
private async Task <IActionResult> HandleReadResultRequest(imsx_RequestHeaderInfoType requestHeader, imsx_POXBodyType requestBody) { var readRequest = requestBody.Item as readResultRequest ?? new readResultRequest(); var readResponse = new readResultResponse(); try { var dto = new ReadResultDto(readRequest.resultRecord.sourcedGUID.sourcedId); await OnReadResult(dto); if (dto.StatusCode == StatusCodes.Status200OK) { if (dto.Result != null) { if (dto.Result.Score.HasValue) { // The score exists readResponse.result = new ResultType { resultScore = new TextType() }; var cultureInfo = new CultureInfo("en"); readResponse.result.resultScore.language = cultureInfo.Name; readResponse.result.resultScore.textString = dto.Result.Score.Value.ToString(cultureInfo); return(CreateSuccessResponse(readResponse, requestHeader.imsx_messageIdentifier, $"Score for {readRequest.resultRecord.sourcedGUID.sourcedId} is read")); } else { // The score could exist, but not found. If the grade has not yet been set via a replaceResult operation // or an existing grade has been deleted via a deleteResult operation, the TC should return a valid // response with a present but empty textString element. The TC should not return 0.0 to indicate a // non-existent grade and the TC should not return a failure status when a grade does not exist. // It should simply return an "empty" grade. readResponse.result = new ResultType { resultScore = new TextType() }; var cultureInfo = new CultureInfo("en"); readResponse.result.resultScore.language = cultureInfo.Name; readResponse.result.resultScore.textString = string.Empty; return(CreateSuccessResponse(readResponse, requestHeader.imsx_messageIdentifier, $"Score for {readRequest.resultRecord.sourcedGUID.sourcedId} is null")); } } } return(StatusCode(dto.StatusCode)); } catch (Exception ex) { return(StatusCode(StatusCodes.Status500InternalServerError, ex)); } }
private imsx_POXEnvelopeType HandleReadResultRequest(imsx_RequestHeaderInfoType requestHeader, imsx_POXBodyType requestBody) { imsx_POXEnvelopeType response; var readRequest = requestBody.Item as readResultRequest ?? new readResultRequest(); var readResponse = new readResultResponse(); var result = ReadResult(readRequest.resultRecord.sourcedGUID.sourcedId); if (result.IsValid) { if (!result.Score.HasValue) { // The score could exist, but not found. If the grade has not yet been set via a replaceResult operation // or an existing grade has been deleted via a deleteResult operation, the TC should return a valid // response with a present but empty textString element. The TC should not return 0.0 to indicate a // non-existent grade and the TC should not return a failure status when a grade does not exist. // It should simply return an "empty" grade. response = CreateSuccessResponse(requestHeader.imsx_messageIdentifier, string.Format("Score for {0} is null", readRequest.resultRecord.sourcedGUID.sourcedId)); readResponse.result = new ResultType(); readResponse.result.resultScore = new TextType(); var cultureInfo = new CultureInfo("en"); readResponse.result.resultScore.language = cultureInfo.Name; readResponse.result.resultScore.textString = string.Empty; } else { // The score exists response = CreateSuccessResponse(requestHeader.imsx_messageIdentifier, string.Format("Score for {0} is read", readRequest.resultRecord.sourcedGUID.sourcedId)); readResponse.result = new ResultType(); readResponse.result.resultScore = new TextType(); var cultureInfo = new CultureInfo("en"); readResponse.result.resultScore.language = cultureInfo.Name; readResponse.result.resultScore.textString = result.Score.Value.ToString(cultureInfo); } } else { // The score could not exist (invalid assignment or user) response = CreateCustomResponse(requestHeader.imsx_messageIdentifier, string.Format("Invalid score sourcedId {0}", readRequest.resultRecord.sourcedGUID.sourcedId), imsx_CodeMajorType.failure); } response.imsx_POXBody.Item = readResponse; return(response); }
private imsx_POXEnvelopeType HandleReplaceResultRequest(imsx_RequestHeaderInfoType requestHeader, imsx_POXBodyType requestBody) { imsx_POXEnvelopeType response; var replaceRequest = requestBody.Item as replaceResultRequest ?? new replaceResultRequest(); var result = GetResult(replaceRequest.resultRecord); if (!result.Score.HasValue) { response = CreateCustomResponse(requestHeader.imsx_messageIdentifier, "Invalid result", imsx_CodeMajorType.failure); } else if (ReplaceResult(result)) { response = CreateSuccessResponse(requestHeader.imsx_messageIdentifier, string.Format("Score for {0} is now {1}", replaceRequest.resultRecord.sourcedGUID.sourcedId, replaceRequest.resultRecord.result.resultScore.textString )); } else { response = CreateCustomResponse(requestHeader.imsx_messageIdentifier, string.Format("Score for {0} not replaced", replaceRequest.resultRecord.sourcedGUID.sourcedId), imsx_CodeMajorType.failure); } response.imsx_POXBody.Item = new replaceResultResponse(); return(response); }
private async Task <IActionResult> HandleReplaceResultRequest(imsx_RequestHeaderInfoType requestHeader, imsx_POXBodyType requestBody) { var replaceRequest = requestBody.Item as replaceResultRequest ?? new replaceResultRequest(); var replaceResponse = new replaceResultResponse(); var result = GetResult(replaceRequest.resultRecord); // The LTI 1.1 specification states in 6.1.1: https://www.imsglobal.org/specs/ltiv1p1/implementation-guide#toc-26 // The TC must check the incoming grade for validity and must fail when a grade is outside the range 0.0-1.0 or if the grade is not a valid number. // The TC must respond to these replaceResult operations with a imsx_codeMajor of "failure". if (!result.Score.HasValue || !(result.Score >= 0 && result.Score <= 1)) { return(CreateFailureResponse(replaceResponse, requestHeader.imsx_messageIdentifier, StatusCodes.Status400BadRequest, "The result score must be a decimal value in the range 0.0 - 1.0")); } try { var request = new ReplaceResultRequest(result); var response = await OnReplaceResultAsync(request); if (response.StatusCode != StatusCodes.Status200OK) { return(CreateFailureResponse(replaceResponse, requestHeader.imsx_messageIdentifier, response.StatusCode, response.StatusDescription)); } return(CreateSuccessResponse(replaceResponse, requestHeader.imsx_messageIdentifier, response.StatusDescription ?? $"Score for {replaceRequest.resultRecord.sourcedGUID.sourcedId} is now {replaceRequest.resultRecord.result.resultScore.textString}")); } catch (Exception ex) { return(CreateFailureResponse(replaceResponse, requestHeader.imsx_messageIdentifier, StatusCodes.Status500InternalServerError, ex.Message)); } }
private imsx_POXEnvelopeType HandleDeleteResultRequest(imsx_RequestHeaderInfoType requestHeader, imsx_POXBodyType requestBody) { imsx_POXEnvelopeType response; var deleteRequest = requestBody.Item as deleteResultRequest ?? new deleteResultRequest(); var deleteResponse = new deleteResultResponse(); var result = GetResult(deleteRequest.resultRecord); if (DeleteResult(result.SourcedId)) { response = CreateSuccessResponse(requestHeader.imsx_messageIdentifier, string.Format("Score for {0} is deleted", result.SourcedId)); } else { response = CreateCustomResponse(requestHeader.imsx_messageIdentifier, string.Format("Score for {0} not deleted", result.SourcedId), imsx_CodeMajorType.failure); } response.imsx_POXBody.Item = deleteResponse; return(response); }
private async Task <IActionResult> HandleReadResultRequest(imsx_RequestHeaderInfoType requestHeader, imsx_POXBodyType requestBody) { var readRequest = requestBody.Item as readResultRequest ?? new readResultRequest(); var readResponse = new readResultResponse(); try { var request = new ReadResultRequest(readRequest.resultRecord.sourcedGUID.sourcedId); var response = await OnReadResultAsync(request).ConfigureAwait(false); if (response.StatusCode != StatusCodes.Status200OK) { return(CreateFailureResponse(readResponse, requestHeader.imsx_messageIdentifier, response.StatusCode, response.StatusDescription)); } if (response.Result == null) { return(CreateFailureResponse(readResponse, requestHeader.imsx_messageIdentifier, response.StatusCode, response.StatusDescription ?? "TC did not read result.")); } readResponse.result = new ResultType { resultScore = new TextType() }; // Add optional responseData if present if (!string.IsNullOrEmpty(response.Result.LtiLaunchUrl + response.Result.Text + response.Result.Url)) { readResponse.result.ResultData = new DataType { LtiLaunchUrl = response.Result.LtiLaunchUrl, Text = response.Result.Text, Url = response.Result.Url }; } if (response.Result.Score.HasValue) { // The score exists readResponse.result.resultScore.language = LtiConstants.ScoreCultureInfo.Name; readResponse.result.resultScore.textString = response.Result.Score.Value.ToString(LtiConstants.ScoreCultureInfo); return(CreateSuccessResponse(readResponse, requestHeader.imsx_messageIdentifier, response.StatusDescription ?? $"Score for {readRequest.resultRecord.sourcedGUID.sourcedId} is read")); } // The score could exist, but not found. If the grade has not yet been set via a replaceResult operation // or an existing grade has been deleted via a deleteResult operation, the TC should return a valid // response with a present but empty textString element. The TC should not return 0.0 to indicate a // non-existent grade and the TC should not return a failure status when a grade does not exist. // It should simply return an "empty" grade. readResponse.result.resultScore.language = LtiConstants.ScoreCultureInfo.Name; readResponse.result.resultScore.textString = string.Empty; return(CreateSuccessResponse(readResponse, requestHeader.imsx_messageIdentifier, response.StatusDescription ?? $"Score for {readRequest.resultRecord.sourcedGUID.sourcedId} is null")); } catch (Exception ex) { return(CreateFailureResponse(readResponse, requestHeader.imsx_messageIdentifier, StatusCodes.Status500InternalServerError, ex.Message)); } }
private async Task <IActionResult> HandleDeleteResultRequest(imsx_RequestHeaderInfoType requestHeader, imsx_POXBodyType requestBody) { var deleteRequest = requestBody.Item as deleteResultRequest ?? new deleteResultRequest(); var deleteResponse = new deleteResultResponse(); var result = GetResult(deleteRequest.resultRecord); try { var request = new DeleteResultRequest(result.SourcedId); var response = await OnDeleteResultAsync(request).ConfigureAwait(false); if (response.StatusCode != StatusCodes.Status200OK) { return(CreateFailureResponse(deleteResponse, requestHeader.imsx_messageIdentifier, response.StatusCode, response.StatusDescription)); } return(CreateSuccessResponse(deleteResponse, requestHeader.imsx_messageIdentifier, response.StatusDescription ?? $"Score for {result.SourcedId} is deleted")); } catch (Exception ex) { return(CreateFailureResponse(deleteResponse, requestHeader.imsx_messageIdentifier, StatusCodes.Status500InternalServerError, ex.Message)); } }
private imsx_POXEnvelopeType HandleReplaceResultRequest(imsx_RequestHeaderInfoType requestHeader, imsx_POXBodyType requestBody) { imsx_POXEnvelopeType response; var replaceRequest = requestBody.Item as replaceResultRequest ?? new replaceResultRequest(); var result = GetResult(replaceRequest.resultRecord); if (!result.Score.HasValue) { response = CreateCustomResponse(requestHeader.imsx_messageIdentifier, "Invalid result", imsx_CodeMajorType.failure); } else if (ReplaceResult(result)) { response = CreateSuccessResponse(requestHeader.imsx_messageIdentifier, $"Score for {replaceRequest.resultRecord.sourcedGUID.sourcedId} is now {replaceRequest.resultRecord.result.resultScore.textString}"); } else { response = CreateCustomResponse(requestHeader.imsx_messageIdentifier, $"Score for {replaceRequest.resultRecord.sourcedGUID.sourcedId} not replaced", imsx_CodeMajorType.failure); } response.imsx_POXBody.Item = new replaceResultResponse(); return response; }
private imsx_POXEnvelopeType HandleReadResultRequest(imsx_RequestHeaderInfoType requestHeader, imsx_POXBodyType requestBody) { imsx_POXEnvelopeType response; var readRequest = requestBody.Item as readResultRequest ?? new readResultRequest(); var readResponse = new readResultResponse(); var result = ReadResult(readRequest.resultRecord.sourcedGUID.sourcedId); if (result.IsValid) { if (!result.Score.HasValue) { // The score could exist, but not found. If the grade has not yet been set via a replaceResult operation // or an existing grade has been deleted via a deleteResult operation, the TC should return a valid // response with a present but empty textString element. The TC should not return 0.0 to indicate a // non-existent grade and the TC should not return a failure status when a grade does not exist. // It should simply return an "empty" grade. response = CreateSuccessResponse(requestHeader.imsx_messageIdentifier, $"Score for {readRequest.resultRecord.sourcedGUID.sourcedId} is null"); readResponse.result = new ResultType {resultScore = new TextType()}; var cultureInfo = new CultureInfo("en"); readResponse.result.resultScore.language = cultureInfo.Name; readResponse.result.resultScore.textString = string.Empty; } else { // The score exists response = CreateSuccessResponse(requestHeader.imsx_messageIdentifier, $"Score for {readRequest.resultRecord.sourcedGUID.sourcedId} is read"); readResponse.result = new ResultType {resultScore = new TextType()}; var cultureInfo = new CultureInfo("en"); readResponse.result.resultScore.language = cultureInfo.Name; readResponse.result.resultScore.textString = result.Score.Value.ToString(cultureInfo); } } else { // The score could not exist (invalid assignment or user) response = CreateCustomResponse(requestHeader.imsx_messageIdentifier, $"Invalid score sourcedId {readRequest.resultRecord.sourcedGUID.sourcedId}", imsx_CodeMajorType.failure); } response.imsx_POXBody.Item = readResponse; return response; }
private imsx_POXEnvelopeType HandleDeleteResultRequest(imsx_RequestHeaderInfoType requestHeader, imsx_POXBodyType requestBody) { imsx_POXEnvelopeType response; var deleteRequest = requestBody.Item as deleteResultRequest ?? new deleteResultRequest(); var deleteResponse = new deleteResultResponse(); var result = GetResult(deleteRequest.resultRecord); if (DeleteResult(result.SourcedId)) { response = CreateSuccessResponse(requestHeader.imsx_messageIdentifier, $"Score for {result.SourcedId} is deleted"); } else { response = CreateCustomResponse(requestHeader.imsx_messageIdentifier, $"Score for {result.SourcedId} not deleted", imsx_CodeMajorType.failure); } response.imsx_POXBody.Item = deleteResponse; return response; }