示例#1
0
        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);
        }
示例#2
0
        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
        }
示例#3
0
        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);
        }
示例#4
0
        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;
            }
        }
示例#5
0
        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
        }
示例#6
0
        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
        }
示例#7
0
        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));
        }
示例#8
0
        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
        }
示例#9
0
        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));
        }
示例#10
0
        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);
        }
示例#11
0
        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);
        }
示例#12
0
        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);
        }
示例#13
0
        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);
            }
        }
示例#14
0
        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);
        }
示例#15
0
        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);
        }
示例#16
0
        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);
        }
示例#17
0
        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);
        }
示例#18
0
        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);
        }
示例#19
0
        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());
        }
示例#20
0
        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);
        }