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