public async Task <Bundle> SearchByPost(string ResourceName) { System.Diagnostics.Debug.WriteLine("GET: " + this.Request.GetDisplayUrl()); var parameters = Request.TupledParameters(true).ToList(); Hl7.Fhir.Rest.SummaryType summary = GetSummaryParameter(Request); string sortby = Request.GetParameter(FhirParameter.SORT); int pagesize = Request.GetIntParameter(FhirParameter.COUNT) ?? Const.DEFAULT_PAGE_SIZE; var buri = this.CalculateBaseURI("{ResourceName}"); IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); // Also grab the application/x-www-form-urlencoded content body if (Request.HasFormContentType) { var requestData = Request.Form; foreach (var item in requestData) { parameters.Add(new KeyValuePair <string, string>(item.Key, item.Value)); } } Bundle result = await model.Search(parameters, pagesize, summary); result.ResourceBase = new Uri(buri); // this.Request.SaveEntry(result); return(result); }
public async Task <IActionResult> Delete(string ResourceName, string id) { System.Diagnostics.Debug.WriteLine("DELETE: " + this.Request.GetDisplayUrl()); var buri = this.CalculateBaseURI("{ResourceName}"); var Inputs = GetInputs(buri); if (ResourceName == "AuditEvent") { // depends on the AuditEvent, if was created by the server, then it will get an unauthorized exception report // otherwise externally reported events can be updated! //throw new FhirServerException(HttpStatusCode.MethodNotAllowed, "Cannot DELETE a AuditEvent"); } IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); string deletedIdentity = await model.Delete(id, null); // Request.Properties.Add(Const.ResourceIdentityKey, deletedIdentity); if (!string.IsNullOrEmpty(deletedIdentity)) { ResourceIdentity ri = new ResourceIdentity(deletedIdentity); return(FhirObjectResult.FhirDeletedResult(ri.VersionId)); } return(FhirObjectResult.FhirDeletedResult()); // for an OperationOutcome return would need to return accepted }
public Bundle SearchByPost(string ResourceName) { System.Diagnostics.Trace.WriteLine("POST: " + this.ControllerContext.Request.RequestUri.OriginalString); var parameters = Request.TupledParameters(true).ToList(); Hl7.Fhir.Rest.SummaryType summary = GetSummaryParameter(Request); string sortby = Request.GetParameter(FhirParameter.SORT); int pagesize = Request.GetIntParameter(FhirParameter.COUNT) ?? Const.DEFAULT_PAGE_SIZE; var buri = this.CalculateBaseURI("{ResourceName}"); IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); // Also grab the application/x-www-form-urlencoded content body if (Request.Content.IsFormData()) { // This is Bad, talk to Andrew again to find out the library to assist with this. var requestData = Request.Content.ReadAsFormDataAsync().Result; foreach (var item in requestData.AllKeys) { parameters.Add(new KeyValuePair <string, string>(item, requestData[item])); } } Bundle result = model.Search(parameters, pagesize, summary); result.ResourceBase = new Uri(buri); this.ControllerContext.Request.SaveEntry(result); return(result); }
public Bundle Search(string ResourceName) { try { System.Diagnostics.Trace.WriteLine("GET: " + this.ControllerContext.Request.RequestUri.OriginalString); var parameters = Request.TupledParameters(true); Hl7.Fhir.Rest.SummaryType summary = GetSummaryParameter(Request); string sortby = Request.GetParameter(FhirParameter.SORT); int pagesize = Request.GetIntParameter(FhirParameter.COUNT) ?? Const.DEFAULT_PAGE_SIZE; var includeParams = Request.TupledParameters(false).Where(i => i.Key == "_include"); var buri = this.CalculateBaseURI("{ResourceName}"); parameters = parameters.Union(includeParams); IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); Bundle result = model.Search(parameters, pagesize, summary); result.ResourceBase = new Uri(buri); this.ControllerContext.Request.SaveEntry(result); return(result); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.ToString()); throw; } }
public HttpResponseMessage Delete(string ResourceName, string id) { System.Diagnostics.Trace.WriteLine("DELETE: " + this.ControllerContext.Request.RequestUri.OriginalString); var buri = this.CalculateBaseURI("{ResourceName}"); var Inputs = GetInputs(buri); if (ResourceName == "AuditEvent") { // depends on the AuditEvent, if was created by the server, then it will get an unauthorized exception report // otherwise externally reported events can be updated! //throw new FhirServerException(HttpStatusCode.MethodNotAllowed, "Cannot DELETE a AuditEvent"); } IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); string deletedIdentity = model.Delete(id, null); Request.Properties.Add(Const.ResourceIdentityKey, deletedIdentity); var msg = Request.CreateResponse(HttpStatusCode.NoContent); if (!string.IsNullOrEmpty(deletedIdentity)) { ResourceIdentity ri = new ResourceIdentity(deletedIdentity); msg.Headers.Add("ETag", String.Format("W/\"{0}\"", ri.VersionId)); } return(msg); // for an OperationOutcome return would need to return accepted }
public HttpResponseMessage Delete(string ResourceName) { System.Diagnostics.Trace.WriteLine("DELETE: " + this.ControllerContext.Request.RequestUri.OriginalString); var buri = this.CalculateBaseURI("{ResourceName}"); var Inputs = GetInputs(buri); if (Request.TupledParameters(false).Count() == 0) { var oo = new OperationOutcome() { Text = Utility.CreateNarative("Precondition Error") }; oo.Issue = new List <OperationOutcome.IssueComponent> { new OperationOutcome.IssueComponent() { Details = new CodeableConcept(null, null, "Conditionally deleting a " + ResourceName + " requires parameters"), Severity = OperationOutcome.IssueSeverity.Fatal } }; // return oo; return(Request.CreateResponse(HttpStatusCode.BadRequest, oo)); } if (ResourceName == "AuditEvent") { // depends on the AuditEvent, if was created by the server, then it will get an unauthorized exception report // otherwise externally reported events can be updated! //throw new FhirServerException(HttpStatusCode.MethodNotAllowed, "Cannot DELETE a AuditEvent"); } IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); string ifMatch = Request.RequestUri.Query; if (ifMatch.StartsWith("?")) { ifMatch = ifMatch.Substring(1); } string deletedIdentity = model.Delete(null, ifMatch); Request.Properties.Add(Const.ResourceIdentityKey, deletedIdentity); var msg = Request.CreateResponse(HttpStatusCode.NoContent); if (!string.IsNullOrEmpty(deletedIdentity)) { ResourceIdentity ri = new ResourceIdentity(deletedIdentity); msg.Headers.Add("ETag", String.Format("W/\"{0}\"", ri.VersionId)); } return(msg); // for an OperationOutcome return would need to return accepted }
public async Task <IActionResult> PerformOperation(string ResourceName, string operation, [FromBody] Parameters operationParameters) { var buri = this.CalculateBaseURI("{ResourceName}"); ExtractParametersFromUrl(ref operationParameters, Request.TupledParameters(false)); Hl7.Fhir.Rest.SummaryType summary = GetSummaryParameter(Request); IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); var resource = await model.PerformOperation(operation, operationParameters, summary); return(PrepareOperationOutputMessage(buri, resource)); }
public async Task <IActionResult> Delete(string ResourceName) { System.Diagnostics.Debug.WriteLine("DELETE: " + this.Request.GetDisplayUrl()); var buri = this.CalculateBaseURI("{ResourceName}"); var Inputs = GetInputs(buri); if (Request.TupledParameters(false).Count() == 0) { var oo = new OperationOutcome() { Text = Utility.CreateNarative("Precondition Error") }; oo.Issue = new List <OperationOutcome.IssueComponent> { new OperationOutcome.IssueComponent() { Details = new CodeableConcept(null, null, "Conditionally deleting a " + ResourceName + " requires parameters"), Severity = OperationOutcome.IssueSeverity.Fatal } }; return(new FhirObjectResult(HttpStatusCode.BadRequest, oo)); } if (ResourceName == "AuditEvent") { // depends on the AuditEvent, if was created by the server, then it will get an unauthorized exception report // otherwise externally reported events can be updated! //throw new FhirServerException(HttpStatusCode.MethodNotAllowed, "Cannot DELETE a AuditEvent"); } IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); string ifMatch = Request.RequestUri().Query; if (ifMatch.StartsWith("?")) { ifMatch = ifMatch.Substring(1); } string deletedIdentity = await model.Delete(null, ifMatch); // Request.Properties.Add(Const.ResourceIdentityKey, deletedIdentity); if (!string.IsNullOrEmpty(deletedIdentity)) { ResourceIdentity ri = new ResourceIdentity(deletedIdentity); return(FhirObjectResult.FhirDeletedResult(ri.VersionId)); } return(FhirObjectResult.FhirDeletedResult()); // for an OperationOutcome return would need to return accepted }
public HttpResponseMessage PerformOperation(string ResourceName, string operation) { var buri = this.CalculateBaseURI("{ResourceName}"); Parameters operationParameters = new Parameters(); ExtractParametersFromUrl(ref operationParameters, Request.TupledParameters(false)); Hl7.Fhir.Rest.SummaryType summary = GetSummaryParameter(Request); IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); var resource = model.PerformOperation(operation, operationParameters, summary); return(PrepareOperationOutputMessage(buri, resource)); }
public async Task <Bundle> ResourceHistory(string ResourceName) { System.Diagnostics.Debug.WriteLine("GET: " + this.Request.GetDisplayUrl()); DateTimeOffset?since = Request.GetDateParameter("_since"); int pagesize = Request.GetIntParameter(FhirParameter.COUNT) ?? Const.DEFAULT_PAGE_SIZE; Hl7.Fhir.Rest.SummaryType summary = GetSummaryParameter(Request); var buri = this.CalculateBaseURI("{ResourceName}"); IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); // TODO: Locate the till parameter in the history Bundle result = await model.TypeHistory(since, null, pagesize, summary); result.ResourceBase = new Uri(buri); // this.Request.SaveEntry(result); return(result); }
public async Task <Bundle> InstanceHistory(string ResourceName, string id) { System.Diagnostics.Debug.WriteLine("GET: " + this.Request.GetDisplayUrl()); DateTimeOffset?since = Request.GetDateParameter("_since"); int pagesize = Request.GetIntParameter(FhirParameter.COUNT) ?? Const.DEFAULT_PAGE_SIZE; Hl7.Fhir.Rest.SummaryType summary = GetSummaryParameter(Request); string sortby = Request.GetParameter(FhirParameter.SORT); var buri = this.CalculateBaseURI("{ResourceName}"); IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); Bundle result = await model.InstanceHistory(id, since, null, pagesize, summary); result.ResourceBase = new Uri(buri); if (result.Total == 0) { try { // Check to see if the item itself exists if (model.Get(id, null, Hl7.Fhir.Rest.SummaryType.True) == null) { // this resource does not exist to have a history throw new FhirServerException(HttpStatusCode.NotFound, "The resource was not found"); } } catch (FhirServerException ex) { if (ex.StatusCode != HttpStatusCode.Gone) { throw ex; } } } // this.Request.SaveEntry(result); return(result); }
public async Task <Bundle> Search(string ResourceName) { System.Diagnostics.Debug.WriteLine("GET: " + this.Request.GetDisplayUrl()); var parameters = Request.TupledParameters(true); Hl7.Fhir.Rest.SummaryType summary = GetSummaryParameter(Request); string sortby = Request.GetParameter(FhirParameter.SORT); int pagesize = Request.GetIntParameter(FhirParameter.COUNT) ?? Const.DEFAULT_PAGE_SIZE; var includeParams = Request.TupledParameters(false).Where(i => i.Key == "_include"); var buri = this.CalculateBaseURI("{ResourceName}"); parameters = parameters.Union(includeParams); IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); Bundle result = await model.Search(parameters, pagesize, summary); result.ResourceBase = new Uri(buri); // this.Request.SaveEntry(result); return(result); }
public HttpResponseMessage Get(string ResourceName, string id, string vid) { try { var buri = this.CalculateBaseURI("{ResourceName}"); if (!Id.IsValidValue(id)) { throw new FhirServerException(HttpStatusCode.BadRequest, "ID [" + id + "] is not a valid FHIR Resource ID"); } var Inputs = GetInputs(buri); IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, Inputs); Hl7.Fhir.Rest.SummaryType summary = GetSummaryParameter(Request); Resource resource = model.Get(id, vid, summary); if (resource != null) { var baseResource = new Hl7.Fhir.Rest.ResourceIdentity(Request.RequestUri); resource.ResourceBase = new Uri(string.Format("http://{0}", baseResource.Authority)); if (resource is DomainResource) { DomainResource dr = resource as DomainResource; switch (summary) { case Hl7.Fhir.Rest.SummaryType.False: break; case Hl7.Fhir.Rest.SummaryType.True: // summary doesn't have the text in it. dr.Text = null; // there are no contained references in the summary form dr.Contained = null; // Add in the Meta Tag that indicates that this resource is only a partial resource.Meta.Tag = new List <Coding> { new Coding("http://hl7.org/fhir/v3/ObservationValue", "SUBSETTED") }; break; case Hl7.Fhir.Rest.SummaryType.Text: // what do we need to filter here break; case Hl7.Fhir.Rest.SummaryType.Data: // summary doesn't have the text in it. dr.Text = null; // Add in the Meta Tag that indicates that this resource is only a partial resource.Meta.Tag = new List <Coding> { new Coding("http://hl7.org/fhir/v3/ObservationValue", "SUBSETTED") }; break; } } if (ResourceName == "Binary") { // We need to reset the accepts type so that the correct formatter is used on the way out. string formatParam = this.ControllerContext.Request.GetParameter("_format"); if (string.IsNullOrEmpty(formatParam)) { this.ControllerContext.Request.Headers.Accept.Clear(); this.ControllerContext.Request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue((resource as Binary).ContentType)); } } var msg = Request.ResourceResponse(resource, HttpStatusCode.OK); msg.Headers.Location = resource.ResourceIdentity().WithBase(resource.ResourceBase); msg.Headers.Add("ETag", String.Format("\"{0}\"", resource.Meta.VersionId)); if (ResourceName == "Binary") { // We need to reset the accepts type so that the correct formatter is used on the way out. string formatParam = this.ControllerContext.Request.GetParameter("_format"); if (string.IsNullOrEmpty(formatParam)) { msg.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = String.Format("fhir_binary_{0}_{1}.{2}", resource.Id, resource.Meta != null ? resource.Meta.VersionId : "0", GetFileExtensionForMimeType((resource as Binary).ContentType)) }; } } return(msg); } // this request is a "you wanted what?" return(Request.CreateResponse(HttpStatusCode.NotFound)); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.Message); return(null); } }
public HttpResponseMessage Post(string ResourceName, [FromBody] Resource bodyResource) { System.Diagnostics.Trace.WriteLine("POST: " + this.ControllerContext.Request.RequestUri.OriginalString); var buri = this.CalculateBaseURI("{ResourceName}"); if (bodyResource == null) { var oo = new OperationOutcome() { Text = Utility.CreateNarative("Validation Error"), // Contained = new List<Resource> { bodyResource } // Can't attach a null resource! }; oo.Issue = new List <OperationOutcome.IssueComponent> { new OperationOutcome.IssueComponent() { Details = new CodeableConcept(null, null, "Missing " + ResourceName + " resource POST"), Severity = OperationOutcome.IssueSeverity.Fatal } }; // return oo; return(Request.CreateResponse(HttpStatusCode.BadRequest, oo)); } if (!String.IsNullOrEmpty(bodyResource.Id)) { var oo = new OperationOutcome() { Text = Utility.CreateNarative("Validation Error"), Contained = new List <Resource> { bodyResource } }; oo.Issue = new List <OperationOutcome.IssueComponent> { new OperationOutcome.IssueComponent() { Details = new CodeableConcept(null, null, "ID must be empty for POST"), Severity = OperationOutcome.IssueSeverity.Fatal } }; // return oo; return(Request.CreateResponse(HttpStatusCode.BadRequest, oo)); } var Inputs = GetInputs(buri); IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); var result = model.Create(bodyResource, null, null, null); this.ControllerContext.Request.SaveEntry(bodyResource); result.ResourceBase = new Uri(buri); var actualResource = result; ResourceIdentity ri = null; if (result is Bundle) { ri = result.ResourceIdentity(result.ResourceBase); } else if (!(result is OperationOutcome) && !string.IsNullOrEmpty(result.Id)) { ri = result.ResourceIdentity(result.ResourceBase); } // Check the prefer header if (Request.Headers.Contains("Prefer")) { string preferHeader = Request.Headers.GetValues("Prefer").FirstOrDefault(); if (preferHeader != null && preferHeader.ToLower() == "return=operationoutcome") { if (!(result is OperationOutcome)) { OperationOutcome so = new OperationOutcome() { Text = Utility.CreateNarative("Resource update") }; so.Text.Status = Narrative.NarrativeStatus.Generated; so.Issue = new List <OperationOutcome.IssueComponent> { new OperationOutcome.IssueComponent() { Severity = OperationOutcome.IssueSeverity.Information, Code = OperationOutcome.IssueType.Informational, Details = new CodeableConcept(null, null, "Update was completed") } }; result = so; } } } HttpResponseMessage returnMessage; if (bodyResource.Annotation <CreateOrUpate>() == CreateOrUpate.Create) { returnMessage = Request.CreateResponse(HttpStatusCode.Created, result); } else { returnMessage = Request.CreateResponse(HttpStatusCode.OK, result); } // Put in the "Location" header if (ri != null) { returnMessage.Headers.Add("Location", ri.OriginalString); Request.Properties.Add(Const.ResourceIdentityKey, ri.MakeRelative().OriginalString); } if (actualResource.Meta != null && !string.IsNullOrEmpty(actualResource.Meta.VersionId)) { returnMessage.Headers.Add("ETag", String.Format("W/\"{0}\"", actualResource.Meta.VersionId)); } if (actualResource.Meta != null && actualResource.Meta.LastUpdated.HasValue) { returnMessage.Content.Headers.LastModified = actualResource.Meta.LastUpdated.Value; // returnMessage.Headers.Add("Last-Modified", actualResource.Meta.LastUpdated.Value.ToString("r")); } // Check the prefer header if (Request.Headers.Contains("Prefer")) { string preferHeader = Request.Headers.GetValues("Prefer").FirstOrDefault(); if (preferHeader != null && preferHeader.ToLower() == "return=minimal") { returnMessage.Content = null; } } return(returnMessage); }
public async Task <IActionResult> Put(string ResourceName, string id, [FromBody] Resource bodyResource) { System.Diagnostics.Debug.WriteLine("PUT: " + this.Request.GetDisplayUrl()); var buri = this.CalculateBaseURI("{ResourceName}"); if (!Id.IsValidValue(id)) { throw new FhirServerException(HttpStatusCode.BadRequest, "ID [" + id + "] is not a valid FHIR Resource ID"); } var Inputs = GetInputs(buri); bodyResource.Id = id; if (ResourceName == "AuditEvent") { // depends on the AuditEvent, if was created by the server, then it will get an unauthorized exception report // otherwise externally reported events can be updated! //throw new FhirServerException(HttpStatusCode.MethodNotAllowed, "Cannot PUT a AuditEvent, you must POST them"); } IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); var result = await model.Create(bodyResource, null, null, null); // this.Request.SaveEntry(bodyResource); result.ResourceBase = new Uri(buri); var actualResource = result; ResourceIdentity ri = null; if (result is Bundle) { ri = result.ResourceIdentity(result.ResourceBase); } else if (!(result is OperationOutcome) && !string.IsNullOrEmpty(result.Id)) { ri = result.ResourceIdentity(result.ResourceBase); } // Check the prefer header if (Request.Headers.ContainsKey("Prefer")) { string preferHeader = Request.Header("Prefer"); if (preferHeader != null && preferHeader.ToLower() == "return=operationoutcome") { if (!(result is OperationOutcome)) { OperationOutcome so = new OperationOutcome() { Text = Utility.CreateNarative("Resource update") }; so.Text.Status = Narrative.NarrativeStatus.Generated; so.Issue = new List <OperationOutcome.IssueComponent> { new OperationOutcome.IssueComponent() { Severity = OperationOutcome.IssueSeverity.Information, Code = OperationOutcome.IssueType.Informational, Details = new CodeableConcept(null, null, "Update was completed") } }; result = so; } } } FhirObjectResult returnMessage; if (bodyResource.Annotation <CreateOrUpate>() == CreateOrUpate.Create) { returnMessage = new FhirObjectResult(HttpStatusCode.Created, result, actualResource); } else { returnMessage = new FhirObjectResult(HttpStatusCode.OK, result, actualResource); } // Check the prefer header if (Request.Headers.ContainsKey("Prefer")) { string preferHeader = Request.Header("Prefer"); if (preferHeader != null && preferHeader.ToLower() == "return=minimal") { returnMessage.Value = null; } } return(returnMessage); }
public async Task <IActionResult> Put(string ResourceName, [FromBody] Resource bodyResource) { System.Diagnostics.Debug.WriteLine("PUT: " + this.Request.GetDisplayUrl()); var buri = this.CalculateBaseURI("{ResourceName}"); if (String.IsNullOrEmpty(this.Request.RequestUri().Query)) { throw new FhirServerException(HttpStatusCode.BadRequest, "Conditional updates not supported without query parameters"); } if (!String.IsNullOrEmpty(bodyResource.Id)) { // This is a conditional update, so clear the Id on the record // so that it doesn't accidentally get processed bodyResource.Id = null; } var Inputs = GetInputs(buri); OperationOutcome so = new OperationOutcome(); if (ResourceName == "AuditEvent") { // depends on the AuditEvent, if was created by the server, then it will get an unauthorized exception report // otherwise externally reported events can be updated! //throw new FhirServerException(HttpStatusCode.MethodNotAllowed, "Cannot PUT a AuditEvent, you must POST them"); } // so.Success(); IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); string ifMatch = null; var conditionalSearchParams = this.Request.TupledParameters(false); if (conditionalSearchParams.Count() > 0) { ifMatch = this.Request.RequestUri().Query; } var result = await model.Create(bodyResource, ifMatch, null, null); // if (bodyResource is Binary) // this.Request.SaveEntry(bodyResource); result.ResourceBase = new Uri(buri); var actualResource = result; // Check the prefer header if (Request.Headers.ContainsKey("Prefer")) { string preferHeader = Request.Header("Prefer"); if (preferHeader != null && preferHeader.ToLower() == "return=operationoutcome") { if (!(result is OperationOutcome)) { so = new OperationOutcome() { Text = Utility.CreateNarative("Resource update") }; so.Text.Status = Narrative.NarrativeStatus.Generated; so.Issue = new List <OperationOutcome.IssueComponent> { new OperationOutcome.IssueComponent() { Severity = OperationOutcome.IssueSeverity.Information, Code = OperationOutcome.IssueType.Informational, Details = new CodeableConcept(null, null, "Update was completed") } }; result = so; } } } FhirObjectResult returnMessage; if (bodyResource.Annotation <CreateOrUpate>() == CreateOrUpate.Create) { returnMessage = new FhirObjectResult(HttpStatusCode.Created, result, actualResource); } else { returnMessage = new FhirObjectResult(HttpStatusCode.OK, result, actualResource); } // Check the prefer header if (Request.Headers.ContainsKey("Prefer")) { string preferHeader = Request.Header("Prefer"); if (preferHeader != null && preferHeader.ToLower() == "return=minimal") { returnMessage.Value = null; } } return(returnMessage); }
public async Task <IActionResult> Post(string ResourceName, [FromBody] Resource bodyResource) { System.Diagnostics.Debug.WriteLine("POST: " + this.Request.GetDisplayUrl()); var buri = this.CalculateBaseURI("{ResourceName}"); if (bodyResource == null) { var oo = new OperationOutcome() { Text = Utility.CreateNarative("Validation Error"), // Contained = new List<Resource> { bodyResource } // Can't attach a null resource! }; oo.Issue = new List <OperationOutcome.IssueComponent> { new OperationOutcome.IssueComponent() { Details = new CodeableConcept(null, null, "Missing " + ResourceName + " resource POST"), Severity = OperationOutcome.IssueSeverity.Fatal } }; return(new BadRequestObjectResult(oo) { StatusCode = (int)HttpStatusCode.BadRequest }); } if (!String.IsNullOrEmpty(bodyResource.Id)) { var oo = new OperationOutcome() { Text = Utility.CreateNarative("Validation Error"), Contained = new List <Resource> { bodyResource } }; oo.Issue = new List <OperationOutcome.IssueComponent> { new OperationOutcome.IssueComponent() { Details = new CodeableConcept(null, null, "ID must be empty for POST"), Severity = OperationOutcome.IssueSeverity.Fatal } }; return(new BadRequestObjectResult(oo) { StatusCode = (int)HttpStatusCode.BadRequest }); } var Inputs = GetInputs(buri); IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); var result = await model.Create(bodyResource, null, null, null); // this.Request.SaveEntry(bodyResource); result.ResourceBase = new Uri(buri); var actualResource = result; ResourceIdentity ri = null; if (result is Bundle) { ri = result.ResourceIdentity(result.ResourceBase); } else if (!(result is OperationOutcome) && !string.IsNullOrEmpty(result.Id)) { ri = result.ResourceIdentity(result.ResourceBase); } // Check the prefer header if (Request.Headers.ContainsKey("Prefer")) { string preferHeader = Request.Header("Prefer"); if (preferHeader != null && preferHeader.ToLower() == "return=operationoutcome") { if (!(result is OperationOutcome)) { OperationOutcome so = new OperationOutcome() { Text = Utility.CreateNarative("Resource update") }; so.Text.Status = Narrative.NarrativeStatus.Generated; so.Issue = new List <OperationOutcome.IssueComponent> { new OperationOutcome.IssueComponent() { Severity = OperationOutcome.IssueSeverity.Information, Code = OperationOutcome.IssueType.Informational, Details = new CodeableConcept(null, null, "Update was completed") } }; result = so; } } } FhirObjectResult returnMessage; if (bodyResource.Annotation <CreateOrUpate>() == CreateOrUpate.Create) { returnMessage = new FhirObjectResult(HttpStatusCode.Created, result, actualResource); } else { returnMessage = new FhirObjectResult(HttpStatusCode.OK, result, actualResource); } // Check the prefer header if (Request.Headers.ContainsKey("Prefer")) { string preferHeader = Request.Header("Prefer"); if (preferHeader != null && preferHeader.ToLower() == "return=minimal") { returnMessage.Value = null; } } return(returnMessage); }
public HttpResponseMessage Put(string ResourceName, [FromBody] Resource bodyResource) { System.Diagnostics.Trace.WriteLine("PUT: " + this.ControllerContext.Request.RequestUri.OriginalString); var buri = this.CalculateBaseURI("{ResourceName}"); if (String.IsNullOrEmpty(this.ControllerContext.Request.RequestUri.Query)) { throw new FhirServerException(HttpStatusCode.BadRequest, "Conditional updates not supported without query parameters"); } if (!String.IsNullOrEmpty(bodyResource.Id)) { // This is a conditional update, so clear the Id on the record // so that it doesn't accidentally get processed bodyResource.Id = null; } var Inputs = GetInputs(buri); OperationOutcome so = new OperationOutcome(); if (ResourceName == "AuditEvent") { // depends on the AuditEvent, if was created by the server, then it will get an unauthorized exception report // otherwise externally reported events can be updated! //throw new FhirServerException(HttpStatusCode.MethodNotAllowed, "Cannot PUT a AuditEvent, you must POST them"); } // so.Success(); IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); string ifMatch = null; var conditionalSearchParams = this.ControllerContext.Request.RequestUri.ParseQueryString().TupledParameters(false); if (conditionalSearchParams.Count() > 0) { ifMatch = this.ControllerContext.Request.RequestUri.Query; } var result = model.Create(bodyResource, ifMatch, null, null); // if (bodyResource is Binary) this.ControllerContext.Request.SaveEntry(bodyResource); result.ResourceBase = new Uri(buri); var actualResource = result; // Check the prefer header if (Request.Headers.Contains("Prefer")) { string preferHeader = Request.Headers.GetValues("Prefer").FirstOrDefault(); if (preferHeader != null && preferHeader.ToLower() == "return=operationoutcome") { if (!(result is OperationOutcome)) { so = new OperationOutcome() { Text = Utility.CreateNarative("Resource update") }; so.Text.Status = Narrative.NarrativeStatus.Generated; so.Issue = new List <OperationOutcome.IssueComponent> { new OperationOutcome.IssueComponent() { Severity = OperationOutcome.IssueSeverity.Information, Code = OperationOutcome.IssueType.Informational, Details = new CodeableConcept(null, null, "Update was completed") } }; result = so; } } } HttpResponseMessage returnMessage; if (bodyResource.Annotation <CreateOrUpate>() == CreateOrUpate.Create) { returnMessage = Request.CreateResponse(HttpStatusCode.Created, result); } else { returnMessage = Request.CreateResponse(HttpStatusCode.OK, result); } // Put in the "Location" header if (actualResource is Bundle) { returnMessage.Headers.Add("Location", result.ResourceIdentity(actualResource.ResourceBase).OriginalString); Request.Properties.Add(Const.ResourceIdentityKey, actualResource.ResourceIdentity().MakeRelative().OriginalString); } else if (!(actualResource is OperationOutcome) && !string.IsNullOrEmpty(actualResource.Id)) { returnMessage.Headers.Add("Location", actualResource.ResourceIdentity(actualResource.ResourceBase).OriginalString); Request.Properties.Add(Const.ResourceIdentityKey, actualResource.ResourceIdentity().MakeRelative().OriginalString); } if (actualResource.Meta != null && !string.IsNullOrEmpty(actualResource.Meta.VersionId)) { returnMessage.Headers.Add("ETag", String.Format("W/\"{0}\"", actualResource.Meta.VersionId)); } if (actualResource.Meta != null && actualResource.Meta.LastUpdated.HasValue) { returnMessage.Content.Headers.LastModified = actualResource.Meta.LastUpdated.Value; // returnMessage.Headers.Add("Last-Modified", actualResource.Meta.LastUpdated.Value.ToString("r")); } // Check the prefer header if (Request.Headers.Contains("Prefer")) { string preferHeader = Request.Headers.GetValues("Prefer").FirstOrDefault(); if (preferHeader != null && preferHeader.ToLower() == "return=minimal") { returnMessage.Content = null; } } return(returnMessage); }
public async Task <IActionResult> Get(string ResourceName, string id, string vid) { var buri = this.CalculateBaseURI("{ResourceName}"); if (!Id.IsValidValue(id)) { throw new FhirServerException(HttpStatusCode.BadRequest, "ID [" + id + "] is not a valid FHIR Resource ID"); } var Inputs = GetInputs(buri); IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, Inputs); Hl7.Fhir.Rest.SummaryType summary = GetSummaryParameter(Request); Resource resource = await model.Get(id, vid, summary); if (resource != null) { resource.ResourceBase = new Hl7.Fhir.Rest.ResourceIdentity(Request.RequestUri()).BaseUri; if (resource is DomainResource) { DomainResource dr = resource as DomainResource; switch (summary) { case Hl7.Fhir.Rest.SummaryType.False: break; case Hl7.Fhir.Rest.SummaryType.True: // summary doesn't have the text in it. dr.Text = null; // there are no contained references in the summary form dr.Contained = null; // Add in the Meta Tag that indicates that this resource is only a partial resource.Meta.Tag = new List <Coding> { new Coding("http://hl7.org/fhir/v3/ObservationValue", "SUBSETTED") }; break; case Hl7.Fhir.Rest.SummaryType.Text: // what do we need to filter here break; case Hl7.Fhir.Rest.SummaryType.Data: // summary doesn't have the text in it. dr.Text = null; // Add in the Meta Tag that indicates that this resource is only a partial resource.Meta.Tag = new List <Coding> { new Coding("http://hl7.org/fhir/v3/ObservationValue", "SUBSETTED") }; break; } } if (ResourceName == "Binary") { // We need to reset the accepts type so that the correct formatter is used on the way out. string formatParam = this.Request.GetParameter("_format"); if (string.IsNullOrEmpty(formatParam)) { this.Request.GetTypedHeaders().Accept.Clear(); this.Request.GetTypedHeaders().Accept.Add(new MediaTypeHeaderValue((resource as Binary).ContentType)); } } return(new ObjectResult(resource)); } // this request is a "you wanted what?" return(new NotFoundResult()); }
public HttpResponseMessage Put(string ResourceName, string id, [FromBody] Resource bodyResource) { System.Diagnostics.Trace.WriteLine("PUT: " + this.ControllerContext.Request.RequestUri.OriginalString); var buri = this.CalculateBaseURI("{ResourceName}"); if (!Id.IsValidValue(id)) { throw new FhirServerException(HttpStatusCode.BadRequest, "ID [" + id + "] is not a valid FHIR Resource ID"); } var Inputs = GetInputs(buri); bodyResource.Id = id; if (ResourceName == "AuditEvent") { // depends on the AuditEvent, if was created by the server, then it will get an unauthorized exception report // otherwise externally reported events can be updated! //throw new FhirServerException(HttpStatusCode.MethodNotAllowed, "Cannot PUT a AuditEvent, you must POST them"); } IFhirResourceServiceSTU3 model = GetResourceModel(ResourceName, GetInputs(buri)); var result = model.Create(bodyResource, null, null, null); this.ControllerContext.Request.SaveEntry(bodyResource); result.ResourceBase = new Uri(buri); var actualResource = result; ResourceIdentity ri = null; if (result is Bundle) { ri = result.ResourceIdentity(result.ResourceBase); } else if (!(result is OperationOutcome) && !string.IsNullOrEmpty(result.Id)) { ri = result.ResourceIdentity(result.ResourceBase); } // Check the prefer header if (Request.Headers.Contains("Prefer")) { string preferHeader = Request.Headers.GetValues("Prefer").FirstOrDefault(); if (preferHeader != null && preferHeader.ToLower() == "return=operationoutcome") { if (!(result is OperationOutcome)) { OperationOutcome so = new OperationOutcome() { Text = Utility.CreateNarative("Resource update") }; so.Text.Status = Narrative.NarrativeStatus.Generated; so.Issue = new List <OperationOutcome.IssueComponent> { new OperationOutcome.IssueComponent() { Severity = OperationOutcome.IssueSeverity.Information, Code = OperationOutcome.IssueType.Informational, Details = new CodeableConcept(null, null, "Update was completed") } }; result = so; } } } HttpResponseMessage returnMessage; if (bodyResource.Annotation <CreateOrUpate>() == CreateOrUpate.Create) { returnMessage = Request.CreateResponse(HttpStatusCode.Created, result); } else { returnMessage = Request.CreateResponse(HttpStatusCode.OK, result); } // Put in the "Location" header if (ri != null) { returnMessage.Headers.Add("Location", ri.OriginalString); Request.Properties.Add(Const.ResourceIdentityKey, ri.MakeRelative().OriginalString); } if (actualResource.Meta != null && !string.IsNullOrEmpty(actualResource.Meta.VersionId)) { returnMessage.Headers.Add("ETag", String.Format("W/\"{0}\"", actualResource.Meta.VersionId)); } if (actualResource.Meta != null && actualResource.Meta.LastUpdated.HasValue) { // returnMessage.Headers.CacheControl. returnMessage.Content.Headers.LastModified = actualResource.Meta.LastUpdated.Value; } // Check the prefer header if (Request.Headers.Contains("Prefer")) { string preferHeader = Request.Headers.GetValues("Prefer").FirstOrDefault(); if (preferHeader != null && preferHeader.ToLower() == "return=minimal") { returnMessage.Content = null; } } return(returnMessage); }