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