Exemple #1
0
        private bool PostProcessing(Bundle.EntryComponent PostEntry, int PostEntryIndex)
        {
            IRequestMeta RequestMeta = IRequestMetaFactory.CreateRequestMeta().Set(PostEntry.Request);

            if (RequestMeta.PyroRequestUri.FhirRequestUri.IsOperation)
            {
                var Message   = $"The FHIR server does not support the use of Operations within Transaction Bundles, found Operation request type of : '{RequestMeta.PyroRequestUri.FhirRequestUri.OperationName}'.";
                var OpOutcome = FhirOperationOutcomeSupport.Create(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.Invalid, Message);
                _ServiceOperationOutcome.ResourceResult = OpOutcome;
                _ServiceOperationOutcome.HttpStatusCode = System.Net.HttpStatusCode.Forbidden;
                _ServiceOperationOutcome.OperationType  = Enum.RestEnum.CrudOperationType.Create;
                return(false);
            }

            IPyroFhirUri ResourceIdToForce = IPyroFhirUriFactory.CreateFhirRequestUri();

            if (String.IsNullOrEmpty(PostEntry.FullUrl))
            {
                //Assgin a new GUID as there is not FullURL GUID to lookup from refererancing
                ResourceIdToForce.Parse($"{PostEntry.Resource.TypeName}/{Common.Tools.FhirGuid.FhirGuid.NewFhirGuid()}");
            }
            else
            {
                //Use the new Resource id that we assigned when updating all referances by looking it up in the GetUUIDfromFullURL dic
                ResourceIdToForce.Parse(OldNewResourceReferanceMap[GetUUIDfromFullURL(PostEntry.FullUrl)]);
            }
            //Remove the Resource Id in the resource as this is a POST and no id should be present in the resource, we do force the new id given this is a transaction operation
            if (!String.IsNullOrEmpty(PostEntry.Resource.Id))
            {
                PostEntry.Resource.Id = String.Empty;
            }

            IResourceServiceOutcome ResourceServiceOutcome = IResourceServices.Post(PostEntry.Resource, RequestMeta, ResourceIdToForce.ResourceId);

            if (ResourceServiceOutcome.SuccessfulTransaction)
            {
                PostEntry.FullUrl         = CreateFullUrl(ResourceServiceOutcome);
                PostEntry.Response        = new Bundle.ResponseComponent();
                PostEntry.Response.Status = FormatHTTPStatusCodeAsString(ResourceServiceOutcome.HttpStatusCode);

                if (ResourceServiceOutcome.ResourceResult != null)
                {
                    if (ResourceServiceOutcome.ResourceResult.ResourceType == ResourceType.OperationOutcome)
                    {
                        PostEntry.Response.Outcome = ResourceServiceOutcome.ResourceResult;
                    }
                    else
                    {
                        PostEntry.Resource = ResourceServiceOutcome.ResourceResult;
                    }
                }
                if (ResourceServiceOutcome.LastModified != null)
                {
                    PostEntry.Response.Etag         = HttpHeaderSupport.GetEntityTagHeaderValueFromVersion(ResourceServiceOutcome.ResourceVersionNumber).ToString();
                    PostEntry.Response.LastModified = ResourceServiceOutcome.LastModified;
                }
                PostEntry.Response.Status   = $"{((int)ResourceServiceOutcome.HttpStatusCode).ToString()} {ResourceServiceOutcome.HttpStatusCode.ToString()}";
                PostEntry.Response.Location = FormatResponseLocation(ResourceServiceOutcome.RequestUri.OriginalString, ResourceServiceOutcome.FhirResourceId, ResourceServiceOutcome.ResourceVersionNumber);
                return(true);
            }
            else
            {
                if (ResourceServiceOutcome.ResourceResult != null && ResourceServiceOutcome.ResourceResult is OperationOutcome Op)
                {
                    IdentifieBatchEntityToClient(Op, PostEntry.FullUrl, "POST", PostEntryIndex);
                }
                _ServiceOperationOutcome = ResourceServiceOutcome;
                return(false);
            }
        }
Exemple #2
0
        public override bool TryParseValue(string Values)
        {
            this.ValueList = new List <SearchParameterReferanceValue>();
            foreach (string Value in Values.Split(OrDelimiter))
            {
                var DtoSearchParameterReferanceValue = new SearchParameterReferanceValue();
                if (this.Modifier.HasValue && this.Modifier == Hl7.Fhir.Model.SearchParameter.SearchModifierCode.Missing)
                {
                    bool?IsMissing = DtoSearchParameterReferanceValue.ParseModifierEqualToMissing(Value);
                    if (IsMissing.HasValue)
                    {
                        DtoSearchParameterReferanceValue.IsMissing = IsMissing.Value;
                        this.ValueList.Add(DtoSearchParameterReferanceValue);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else if (!this.IsChained) // If IsChained then there is no value to check
                {
                    IPyroFhirUri RequestUri = IPyroFhirUriFactory.CreateFhirRequestUri();
                    if (RequestUri.Parse(Value.Trim()))
                    {
                        DtoSearchParameterReferanceValue.FhirRequestUri = RequestUri;
                    }
                    else if (!string.IsNullOrWhiteSpace(Value.Trim()) && this.Modifier.HasValue && this.Modifier == Hl7.Fhir.Model.SearchParameter.SearchModifierCode.Type && !string.IsNullOrWhiteSpace(this.TypeModifierResource))
                    {
                        IPyroFhirUri RequestUri2 = IPyroFhirUriFactory.CreateFhirRequestUri();
                        if (RequestUri2.Parse($"{this.TypeModifierResource}/{Value.Trim()}"))
                        {
                            DtoSearchParameterReferanceValue.FhirRequestUri = RequestUri2;
                        }
                        else
                        {
                            this.InvalidMessage = $"Unable to parse the Resource reference search parameter. {RequestUri2.ParseErrorMessage}";
                            return(false);
                        }
                    }
                    else if (!string.IsNullOrWhiteSpace(Value.Trim()) && this.AllowedReferanceResourceList.Count() == 1)
                    {
                        IPyroFhirUri RequestUri3 = IPyroFhirUriFactory.CreateFhirRequestUri();
                        if (RequestUri3.Parse($"{this.AllowedReferanceResourceList[0]}/{Value.Trim()}"))
                        {
                            DtoSearchParameterReferanceValue.FhirRequestUri = RequestUri3;
                        }
                        else
                        {
                            this.InvalidMessage = $"The Resource Name was not given as a Type modifier in the reference search parameter and the search parameter supports many Resource types. You must specify the resource name the reference relates to. {RequestUri3.ParseErrorMessage}";
                            return(false);
                        }
                    }
                    else
                    {
                        this.InvalidMessage = $"The Resource Name was not given as a Type modifier in the reference search parameter and the search parameter supports many Resource types. You must specify the resource name the reference relates to.";
                        return(false);
                    }

                    if (!this.AllowedReferanceResourceList.Contains(DtoSearchParameterReferanceValue.FhirRequestUri.ResourseName))
                    {
                        this.InvalidMessage = $"The Resource Name used in the reference search parameter is not allowed for this search parameter against this Resource.";
                        return(false);
                    }
                    else
                    {
                        this.ValueList.Add(DtoSearchParameterReferanceValue);
                    }
                }
            }
            if (this.ValueList.Count() > 1)
            {
                this.HasLogicalOrProperties = true;
            }
            if (this.IsChained || this.ValueList.Count > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
Exemple #3
0
        //public override bool TryParseValueOLD(string Values)
        //{
        //  this.ValueList = new List<SearchParameterReferanceValue>();
        //  foreach (string Value in Values.Split(OrDelimiter))
        //  {
        //    var DtoSearchParameterReferanceValue = new SearchParameterReferanceValue();
        //    if (this.Modifier.HasValue && this.Modifier == Hl7.Fhir.Model.SearchParameter.SearchModifierCode.Missing)
        //    {
        //      bool? IsMissing = DtoSearchParameterReferanceValue.ParseModifierEqualToMissing(Value);
        //      if (IsMissing.HasValue)
        //      {
        //        DtoSearchParameterReferanceValue.IsMissing = IsMissing.Value;
        //        this.ValueList.Add(DtoSearchParameterReferanceValue);
        //      }
        //      else
        //      {
        //        return false;
        //      }
        //    }
        //    else if (!this.IsChained) // If IsChained then there is no value to check
        //    {
        //      IPyroFhirUri RequestUri = IPyroFhirUriFactory.CreateFhirRequestUri();
        //      if (RequestUri.Parse(Value.Trim()))
        //      {
        //        DtoSearchParameterReferanceValue.FhirRequestUri = RequestUri;
        //      }
        //      else if (!string.IsNullOrWhiteSpace(Value.Trim()) && this.Modifier.HasValue && this.Modifier == Hl7.Fhir.Model.SearchParameter.SearchModifierCode.Type && !string.IsNullOrWhiteSpace(this.TypeModifierResource))
        //      {
        //        IPyroFhirUri RequestUri2 = IPyroFhirUriFactory.CreateFhirRequestUri();
        //        if (RequestUri2.Parse($"{this.TypeModifierResource}/{Value.Trim()}"))
        //        {
        //          DtoSearchParameterReferanceValue.FhirRequestUri = RequestUri2;
        //        }
        //        else
        //        {
        //          this.InvalidMessage = $"Unable to parse the Resource reference search parameter. {RequestUri2.ParseErrorMessage}";
        //          return false;
        //        }
        //      }
        //      else if (!string.IsNullOrWhiteSpace(Value.Trim()) && this.AllowedReferanceResourceList.Count() == 1)
        //      {
        //        IPyroFhirUri RequestUri3 = IPyroFhirUriFactory.CreateFhirRequestUri();
        //        if (RequestUri3.Parse($"{this.AllowedReferanceResourceList[0]}/{Value.Trim()}"))
        //        {
        //          DtoSearchParameterReferanceValue.FhirRequestUri = RequestUri3;
        //        }
        //        else
        //        {
        //          this.InvalidMessage = $"The Resource Name was not given as a Type modifier in the reference search parameter and the search parameter supports many Resource types. You must specify the resource name the reference relates to. {RequestUri3.ParseErrorMessage}";
        //          return false;
        //        }
        //      }
        //      else
        //      {
        //        this.InvalidMessage = $"The Resource Name was not given as a Type modifier in the reference search parameter and the search parameter supports many Resource types. You must specify the resource name the reference relates to.";
        //        return false;
        //      }

        //      if (!this.AllowedReferanceResourceList.Contains(DtoSearchParameterReferanceValue.FhirRequestUri.ResourseName))
        //      {
        //        this.InvalidMessage = $"The Resource Name used in the reference search parameter is not allowed for this search parameter against this Resource.";
        //        return false;
        //      }
        //      else
        //      {
        //        this.ValueList.Add(DtoSearchParameterReferanceValue);
        //      }
        //    }

        //  }
        //  if (this.ValueList.Count() > 1)
        //    this.HasLogicalOrProperties = true;
        //  if (this.IsChained || this.ValueList.Count > 0)
        //  {
        //    return true;
        //  }
        //  else
        //  {
        //    return false;
        //  }
        //}

        public override bool TryParseValue(string Values)
        {
            this.ValueList = new List <SearchParameterReferanceValue>();
            foreach (string Value in Values.Split(OrDelimiter))
            {
                var DtoSearchParameterReferanceValue = new SearchParameterReferanceValue();
                if (this.Modifier.HasValue && this.Modifier == Hl7.Fhir.Model.SearchParameter.SearchModifierCode.Missing)
                {
                    bool?IsMissing = DtoSearchParameterReferanceValue.ParseModifierEqualToMissing(Value);
                    if (IsMissing.HasValue)
                    {
                        DtoSearchParameterReferanceValue.IsMissing = IsMissing.Value;
                        this.ValueList.Add(DtoSearchParameterReferanceValue);
                    }
                    else
                    {
                        this.InvalidMessage = $"Found the {Hl7.Fhir.Model.SearchParameter.SearchModifierCode.Missing.GetPyroLiteral()} Modifier yet is value was expected to be true or false yet found '{Value}'. ";
                        return(false);
                    }
                }
                else if (!this.IsChained) // If IsChained then there is no value to check
                {
                    IPyroFhirUri RequestUri = IPyroFhirUriFactory.CreateFhirRequestUri();
                    if (!Value.Contains('/') && !string.IsNullOrWhiteSpace(Value.Trim()) && this.AllowedReferanceResourceList.Count() == 1)
                    {
                        //If only one allowed Resource type then use this
                        string ParseValue = $"{this.AllowedReferanceResourceList[0]}/{Value.Trim()}";
                        if (RequestUri.Parse(ParseValue))
                        {
                            DtoSearchParameterReferanceValue.FhirRequestUri = RequestUri;
                        }
                    }
                    else if (RequestUri.Parse(Value.Trim()))
                    {
                        //Most likely an absolute or relative so just parse it
                        DtoSearchParameterReferanceValue.FhirRequestUri = RequestUri;
                    }
                    else
                    {
                        this.InvalidMessage = $"Unable to parse the reference search parameter of: '{Value}'. {RequestUri.ErrorInParseing}";
                        return(false);
                    }

                    //Check the Resource type we resolved to is allowed for the search parameter
                    if (!string.IsNullOrWhiteSpace(DtoSearchParameterReferanceValue.FhirRequestUri.ResourseName) && !this.AllowedReferanceResourceList.Contains(DtoSearchParameterReferanceValue.FhirRequestUri.ResourseName))
                    {
                        this.InvalidMessage = $"The Resource Name used in the reference search parameter is not allowed for this search parameter against this Resource.";
                        return(false);
                    }
                    else
                    {
                        this.ValueList.Add(DtoSearchParameterReferanceValue);
                    }
                }
            }
            if (this.ValueList.Count() > 1)
            {
                this.HasLogicalOrProperties = true;
            }
            if (this.IsChained || this.ValueList.Count > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
Exemple #4
0
 public PyroRequestUri(IPrimaryServiceRootCache IPrimaryServiceRootCache, IPyroFhirUri IPyroFhirUri)
 {
     this.IPrimaryServiceRootCache = IPrimaryServiceRootCache;
     this.FhirRequestUri           = IPyroFhirUri;
 }
        private ValidationOperationItems ConsoladateValidationOperationItems(ValidationOperationItems FromUrl, ValidationOperationItems FromParameters)
        {
            var OpOutComeIssues = new List <OperationOutcome.IssueComponent>();
            var ReturnValidationOperationItems = new ValidationOperationItems();

            //Profile
            IPyroFhirUri FhirRequestUriFromUrl        = null;
            IPyroFhirUri FhirRequestUriFromParameters = null;

            if (string.IsNullOrWhiteSpace(FromUrl.ProfileUri) && string.IsNullOrWhiteSpace(FromParameters.ProfileUri))
            {
                var OpOutComeIssue = Common.Tools.FhirOperationOutcomeSupport.CreateIssue(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.NotSupported,
                                                                                          $"No Profile URI found in either the request URL or the Parameter body, Validation cannot be performed with out a profile reference.");
                IssueList.Add(OpOutComeIssue);
            }
            else if (!string.IsNullOrWhiteSpace(FromUrl.ProfileUri))
            {
                FhirRequestUriFromUrl = IPyroFhirUriFactory.CreateFhirRequestUri();
                if (FhirRequestUriFromUrl.Parse(FromUrl.ProfileUri))
                {
                    ReturnValidationOperationItems.FhirRequestUriProfileUri = FhirRequestUriFromUrl;
                    ReturnValidationOperationItems.ProfileUri = FromUrl.ProfileUri;
                }
                else
                {
                    var OpOutComeIssue = Common.Tools.FhirOperationOutcomeSupport.CreateIssue(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.NotSupported,
                                                                                              $"Error in parsing the profile URI found in the request URL, parse error is: {FhirRequestUriFromUrl.ParseErrorMessage}");
                    IssueList.Add(OpOutComeIssue);
                }
            }
            else if (!string.IsNullOrWhiteSpace(FromParameters.ProfileUri))
            {
                FhirRequestUriFromParameters = IPyroFhirUriFactory.CreateFhirRequestUri();
                if (FhirRequestUriFromParameters.Parse(FromParameters.ProfileUri))
                {
                    ReturnValidationOperationItems.FhirRequestUriProfileUri = FhirRequestUriFromParameters;
                    ReturnValidationOperationItems.ProfileUri = FromParameters.ProfileUri;
                }
                else
                {
                    var OpOutComeIssue = Common.Tools.FhirOperationOutcomeSupport.CreateIssue(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.NotSupported,
                                                                                              $"Error in parsing the profile URI found in the Parameters resource, parse error is: {FhirRequestUriFromParameters.ParseErrorMessage}");
                    IssueList.Add(OpOutComeIssue);
                }
            }


            //Mode
            if (!FromUrl.ValidationMode.HasValue && !FromParameters.ValidationMode.HasValue)
            {
                string Message        = $"The mode property is not set to a valid value. Must be either (create, update, delete) or not set at all.";
                var    OpOutComeIssue = Common.Tools.FhirOperationOutcomeSupport.CreateIssue(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.NotSupported, Message);
                IssueList.Add(OpOutComeIssue);
            }
            else if (FromUrl.ValidationMode.HasValue)
            {
                ReturnValidationOperationItems.ValidationMode = FromUrl.ValidationMode.Value;
            }
            else if (FromParameters.ValidationMode.HasValue)
            {
                ReturnValidationOperationItems.ValidationMode = FromParameters.ValidationMode.Value;
            }
            else
            {
                throw new Exception("Server error: Mode parameter not found in Parameter Resource or URL, yet null check failed. ");
            }

            //Resource
            if (FromParameters.ResourceToValidate != null)
            {
                ReturnValidationOperationItems.ResourceToValidate = FromParameters.ResourceToValidate;
            }
            else
            {
                ReturnValidationOperationItems.ResourceToValidate = FromUrl.ResourceToValidate;
            }

            //Report Errors
            if (IssueList.Count > 0)
            {
                return(null);
            }

            return(ReturnValidationOperationItems);
        }