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);

                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."));
                }

                if (response.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 = response.Result.Score.Value.ToString(cultureInfo);
                    return(CreateSuccessResponse(readResponse, requestHeader.imsx_messageIdentifier,
                                                 response.StatusDescription ?? $"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,
                                                 response.StatusDescription ?? $"Score for {readRequest.resultRecord.sourcedGUID.sourcedId} is null"));
                }
            }
            catch (Exception ex)
            {
                return(CreateFailureResponse(readResponse, requestHeader.imsx_messageIdentifier,
                                             StatusCodes.Status500InternalServerError, ex.Message));
            }
        }
        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 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;
        }