Exemple #1
0
        private static bool IsValidRequest(TransformationTestRequest request, out string message)
        {
            if (request == null)
            {
                message = "Request body can not be null";
                return(false);
            }

            if (string.IsNullOrWhiteSpace(request.FhirMapping))
            {
                message = "FHIR Mapping can not be null or empty.";
                return(false);
            }

            if (string.IsNullOrWhiteSpace(request.NormalizedData))
            {
                message = "Normalized data can not be null or empty.";
                return(false);
            }

            if (!Utility.IsValidJson(request.FhirMapping, out message) ||
                !Utility.IsValidJson(request.NormalizedData, out message))
            {
                return(false);
            }

            try
            {
                Enum.Parse(typeof(FhirVersion), request.FhirVersion, true);
            }
            catch (Exception)
            {
                message = $"The provided FHIR version \"{request.FhirVersion}\" is not valid or supported.";
                return(false);
            }

            try
            {
                Enum.Parse(typeof(FhirIdentityResolutionType), request.FhirIdentityResolutionType, true);
            }
            catch (Exception)
            {
                message = $"The provided Identity Resolution Type \"{request.FhirIdentityResolutionType}\" is not valid or supported.";
                return(false);
            }

            message = null;
            return(true);
        }
Exemple #2
0
        public IActionResult Post([FromBody] TransformationTestRequest request)
        {
            // Validate Request.
            if (!IsValidRequest(request, out string errorMessage))
            {
                return(this.BadRequest(
                           new TransformationTestResponse()
                {
                    Result = TestResult.Fail.ToString(),
                    Reason = errorMessage,
                }));
            }

            // Validate mapping semantic.
            var templateContext = CollectionFhirTemplateFactory.Default.Create(request.FhirMapping);

            if (!templateContext.IsValid(out string errors))
            {
                return(this.BadRequest(
                           new TransformationTestResponse()
                {
                    Result = TestResult.Fail.ToString(),
                    Reason = errors,
                }));
            }

            FhirVersion fhirVersion = (FhirVersion)Enum.Parse(typeof(FhirVersion), request.FhirVersion, true);
            FhirIdentityResolutionType fhirIdentityResolutionType = (FhirIdentityResolutionType)Enum.Parse(typeof(FhirIdentityResolutionType), request.FhirIdentityResolutionType, true);
            IMeasurementGroup          measurementGroup;

            try
            {
                measurementGroup = JToken.Parse(request.NormalizedData).ToObject <MeasurementGroup>();

                if (string.IsNullOrWhiteSpace(measurementGroup.DeviceId))
                {
                    return(this.BadRequest(
                               new TransformationTestResponse()
                    {
                        Result = TestResult.Fail.ToString(),
                        Reason = "Device Id can't be null or empty.",
                    }));
                }

                if (fhirIdentityResolutionType == FhirIdentityResolutionType.Create &&
                    string.IsNullOrWhiteSpace(measurementGroup.PatientId))
                {
                    return(this.BadRequest(
                               new TransformationTestResponse()
                    {
                        Result = TestResult.Fail.ToString(),
                        Reason = "Patient Id can't be null with identity resolution type as \"Create\".",
                    }));
                }
            }
            catch (Exception ex)
            {
                return(this.BadRequest(
                           new TransformationTestResponse()
                {
                    Result = TestResult.Fail.ToString(),
                    Reason = ex.Message,
                }));
            }

            // Start processing.
            try
            {
                FhirLookupTemplateProcessor <Observation> processor = GetFhirTemplateProcessor(fhirVersion);
                var grps = processor.CreateObservationGroups(templateContext.Template, measurementGroup);

                Observation observation = null;
                string      deviceId    = measurementGroup.DeviceId;
                string      patientId   =
                    fhirIdentityResolutionType == FhirIdentityResolutionType.Create ? measurementGroup.PatientId : PatientIdPlaceholder;
                foreach (var grp in grps)
                {
                    if (observation == null)
                    {
                        observation         = processor.CreateObservation(templateContext.Template, grp);
                        observation.Subject = patientId.ToReference <Patient>();
                        observation.Device  = deviceId.ToReference <Device>();

                        var identity        = GenerateObservationId(grp, deviceId, patientId);
                        var observerationId = new Identifier
                        {
                            System = identity.System,
                            Value  = identity.Identifer,
                        };

                        observation.Identifier = new List <Identifier> {
                            observerationId
                        };
                    }
                    else
                    {
                        observation = processor.MergeObservation(templateContext.Template, grp, observation);
                    }
                }

                return(this.Ok(
                           new TransformationTestResponse()
                {
                    Result = TestResult.Success.ToString(),
                    FhirData = observation.ToJson(new FhirJsonSerializationSettings()
                    {
                        Pretty = true,
                    }),
                }));
            }
            catch (Exception ex)
            {
                return(this.BadRequest(
                           new TransformationTestResponse()
                {
                    Result = TestResult.Fail.ToString(),
                    Reason = ex.Message,
                }));
            }
        }