public Stream TerminzBatch() { string rv = string.Empty; string responseType = GetResponseType(); string fhirVersion = GetFhirVersion(); // get Bundle from the Request Stream string reqBody = string.Empty; UTF8Encoding enc = new UTF8Encoding(); Stream reqStream = OperationContext.Current.RequestContext.RequestMessage.GetBody <Stream>(); using (StreamReader reader = new StreamReader(reqStream, enc)) { reqBody = reader.ReadToEnd(); } string reqType = WebOperationContext.Current.IncomingRequest.ContentType.ToLower(); Resource fhirResource; if (reqType.Contains("json")) { FhirJsonParser fjp = new FhirJsonParser(); fhirResource = fjp.Parse <Resource>(reqBody); } else { FhirXmlParser fxp = new FhirXmlParser(); fhirResource = fxp.Parse <Resource>(reqBody); } if (fhirResource.ResourceType == ResourceType.Bundle) { Bundle fb = (Bundle)fhirResource; if (fb.Type == Bundle.BundleType.Batch) { Bundle responseBundle = new Bundle(); responseBundle.Id = Guid.NewGuid().ToString(); responseBundle.Type = Bundle.BundleType.BatchResponse; foreach (Bundle.EntryComponent comp in fb.Entry) { Bundle.RequestComponent rc = comp.Request; if (rc.Method == Bundle.HTTPVerb.GET) { if (rc.Url.IndexOf("$validate-code") > 0) { // extract and parse query string to get parameters int qsPos = rc.Url.IndexOf('?'); string querystring = (qsPos < rc.Url.Length - 1) ? rc.Url.Substring(qsPos + 1) : String.Empty; qParam = System.Web.HttpUtility.ParseQueryString(querystring); // extract resource (CodeSystem or ValueSet) ID string resourceID = string.Empty; string resourceName = resourceID.IndexOf("/ValueSet/") > 0 ? "ValueSet" : "CodeSystem"; try { resourceID = rc.Url.Remove(qsPos); int resNamePos = resourceID.IndexOf("/" + resourceName + "/"); resourceID = resourceID.Substring(resNamePos + 9).Replace("/", "").Replace("$validate-code", ""); } catch { } ServiceInterface appSi = new ServiceInterface(); responseBundle.AddResourceEntry(appSi.GetFhirResource(resourceName, resourceID, "$validate-code", qParam, fhirVersion), string.Empty); } else { responseBundle.AddResourceEntry(OperationOutcome.ForMessage("Unrecognised Operation in Request..." + rc.Url, OperationOutcome.IssueType.Unknown), string.Empty); } } else if (rc.Method == Bundle.HTTPVerb.POST) { if (rc.Url.IndexOf("$translate") > 0 && comp.Resource.ResourceType == ResourceType.Parameters) { // extract ConceptMap ID string cmID = string.Empty; try { cmID = rc.Url.Replace("ConceptMap/", "").Replace("$translate", "").Replace("/", ""); } catch { } // get parameters Parameters fParam = (Parameters)comp.Resource; SetQueryParameters(fParam); ServiceInterface appSi = new ServiceInterface(); responseBundle.AddResourceEntry(appSi.GetFhirResource("ConceptMap", cmID, "$translate", qParam, fhirVersion), string.Empty); } else { responseBundle.AddResourceEntry(OperationOutcome.ForMessage("Unrecognised Operation in Request..." + rc.Url, OperationOutcome.IssueType.Unknown), string.Empty); } } else { responseBundle.AddResourceEntry(OperationOutcome.ForMessage("Method Not Supported in Batch Mode '" + rc.Method.ToString() + "'", OperationOutcome.IssueType.NotSupported), string.Empty); } } fhirResource = responseBundle; } else { fhirResource = OperationOutcome.ForMessage("No module could be found to handle the bundle type '" + fb.TypeName + "'", OperationOutcome.IssueType.NotFound); } } else { fhirResource = OperationOutcome.ForMessage("No module could be found to handle the request '" + fhirResource.ResourceType.ToString() + "'", OperationOutcome.IssueType.NotFound); } if (fhirResource.ResourceType == ResourceType.OperationOutcome) { AddNarrativeToOperationOutcome(fhirResource); OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse; response.StatusCode = HttpStatusCode.BadRequest; // if wish for more granular response codes, need Issue Type //OperationOutcome oo = (OperationOutcome)fhirResource; //OperationOutcome.IssueType opOutcome = (OperationOutcome.IssueType)oo.Issue[0].Code; } // convert to stream to remove leading XML elements and json quotes rv = SerializeResponse(fhirResource, responseType, SummaryType.False); return(new System.IO.MemoryStream(UTF8Encoding.Default.GetBytes(rv))); }
public Stream TerminzGet(string resource, string id, string operation) { string rv = string.Empty; string summaryQueryStringValue = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["_summary"]; string responseType = GetResponseType(); string fhirVersion = GetFhirVersion(); // If {id} is empty, {$operation} will be in that URL segment - all terminology operations start with $ string reqId = id; string reqOperation = operation; if (!string.IsNullOrEmpty(id) && id.StartsWith("$")) { reqId = string.Empty; reqOperation = id; } // handle pure operation calls - e.g. $versions if (resource.StartsWith("$")) { reqOperation = resource; resource = string.Empty; } if (this.qParam.Count == 0) // i.e. hasn't been populated from POST { qParam = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters; } // remove summary type and format from query parameters as they are only processed at this layer qParam.Remove("_format"); qParam.Remove("_summary"); ServiceInterface appSi = new ServiceInterface(); Resource fhirResource = appSi.GetFhirResource(resource, reqId, reqOperation, qParam, fhirVersion); SummaryType st = SummaryType.False; // honour summary type requests if (!string.IsNullOrEmpty(summaryQueryStringValue)) { if (summaryQueryStringValue.Equals("count", System.StringComparison.OrdinalIgnoreCase)) { st = SummaryType.Count; } if (summaryQueryStringValue.Equals("data", System.StringComparison.OrdinalIgnoreCase)) { st = SummaryType.Data; } if (summaryQueryStringValue.Equals("text", System.StringComparison.OrdinalIgnoreCase)) { st = SummaryType.Text; } if (summaryQueryStringValue.Equals("true", System.StringComparison.OrdinalIgnoreCase)) { st = SummaryType.True; } } if (fhirResource.ResourceType == ResourceType.OperationOutcome) { AddNarrativeToOperationOutcome(fhirResource); OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse; response.StatusCode = HttpStatusCode.BadRequest; } // convert to stream to remove leading XML elements and json quotes rv = SerializeResponse(fhirResource, responseType, st); return(new System.IO.MemoryStream(UTF8Encoding.UTF8.GetBytes(rv))); }