public IRequestMeta Set(HttpRequestMessage Request) { this.PyroRequestUri = IPyroRequestUriFactory.CreateFhirRequestUri(); this.PyroRequestUri.FhirRequestUri.Parse(Request.RequestUri.OriginalString); this.RequestHeader = IRequestHeaderFactory.CreateRequestHeader().Parse(Request.Headers); this.SearchParameterGeneric = ISearchParameterGenericFactory.CreateDtoSearchParameterGeneric().Parse(Request.GetSearchParams()); return(this); }
public PyroSearchParameters GetSearchParameters(string Compartment, string CompartmentId, string ResourceName) { //I need to check that Compartment and ResourceName are actual FHIR Resource Types, the two lines //below do that and throw Pyro Exception if they are not. FHIRAllTypes CompartmentType = ResourceNameResolutionSupport.GetResourceFhirAllType(Compartment); FHIRAllTypes ResourceNameType = ResourceNameResolutionSupport.GetResourceFhirAllType(ResourceName); //Now to contruct the Container search parameters, these are cached from the database Conatiner Resource DtoServiceCompartmentResourceCached ServiceCompartmentResource = IServiceCompartmentCache.GetServiceCompartmentResourceForCompartmentCodeAndResource(Compartment, ResourceName); string ConatinerSerachString = string.Empty; if (ServiceCompartmentResource != null) { var CompartmentParamQuery = new List <string>(); foreach (var CompartmentSearchParameter in ServiceCompartmentResource.ParamList) { if (CompartmentSearchParameter.Param == "*") { // if the param="*" then all instances of this Resource Type are in the container and there are no // actualy parameters that it needs to be restricted by. So the ConatinerSerachString remains as empty string. break; } else { CompartmentParamQuery.Add($"{CompartmentSearchParameter.Param}:{Compartment}={CompartmentId}"); } } ConatinerSerachString = String.Join("&", CompartmentParamQuery.ToArray()); } else { DtoServiceCompartmentCached ServiceCompartment = IServiceCompartmentCache.GetServiceCompartmentForCompartmentCode(Compartment); if (ServiceCompartment == null) { string Message = $"No active {Compartment} Compartment exist in this server. Perhaps you could create one using a {FHIRAllTypes.CompartmentDefinition.GetLiteral()} resource and the resource instance ${Pyro.Common.Enum.FhirOperationEnum.OperationType.xSetCompartmentActive} Operation. " + $"For example: '[base]/{FHIRAllTypes.CompartmentDefinition.GetLiteral()}/[id]/${Pyro.Common.Enum.FhirOperationEnum.OperationType.xSetCompartmentActive}' "; var OpOutcome = FhirOperationOutcomeSupport.Create(OperationOutcome.IssueSeverity.Fatal, OperationOutcome.IssueType.NotSupported, Message); throw new PyroException(System.Net.HttpStatusCode.BadRequest, OpOutcome, Message); } else { string Message = $"The {Compartment} Compartment defined by the {FHIRAllTypes.CompartmentDefinition.GetLiteral()} with the resource id of '{ServiceCompartment.CompartmentDefinitionResourceId}' does not allow access to any {ResourceName} resource type instances."; var OpOutcome = FhirOperationOutcomeSupport.Create(OperationOutcome.IssueSeverity.Fatal, OperationOutcome.IssueType.NotSupported, Message); throw new PyroException(System.Net.HttpStatusCode.BadRequest, OpOutcome, Message); } } ISearchParameterGeneric ContainerSearchParameterGeneric = ISearchParameterGenericFactory.CreateDtoSearchParameterGeneric().Parse(ConatinerSerachString); ISearchParameterService SearchService = ISearchParameterServiceFactory.CreateSearchParameterService(); ISearchParametersServiceOutcome ContainerSearchParametersServiceOutcome = SearchService.ProcessSearchParameters(ContainerSearchParameterGeneric, SearchParameterService.SearchParameterServiceType.Resource, ResourceNameType, null); return(ContainerSearchParametersServiceOutcome.SearchParameters); }
//Old Method for chaining, not in use public ISearchParameterBase CreateSearchParameter_OLD(DtoServiceSearchParameterLight DtoSupportedSearchParametersResource, Tuple <string, string> Parameter) { ISearchParameterBase oSearchParameter = InitalizeSearchParameter(DtoSupportedSearchParametersResource.Type); string ParameterName = Parameter.Item1; string ParameterValue = Parameter.Item2; oSearchParameter.Id = DtoSupportedSearchParametersResource.Id; oSearchParameter.Resource = DtoSupportedSearchParametersResource.Resource; oSearchParameter.Name = DtoSupportedSearchParametersResource.Name; oSearchParameter.TargetResourceTypeList = DtoSupportedSearchParametersResource.TargetResourceTypeList; oSearchParameter.RawValue = ParameterName + _ParameterNameParameterValueDilimeter + ParameterValue; _RawSearchParameterAndValueString = oSearchParameter.RawValue; if (!ParseModifier(ParameterName, oSearchParameter)) { oSearchParameter.IsValid = false; oSearchParameter.InvalidMessage = $"Unable to parse the given search parameter's Modifier: {ParameterName}', "; } if (ParameterName.Contains(Hl7.Fhir.Rest.SearchParams.SEARCH_CHAINSEPARATOR)) { //This is a resourceReferance with a Chained parameter, resolve that chained parameter to a search parameter here (is a recursive call). var SearchParameterGeneric = ISearchParameterGenericFactory.CreateDtoSearchParameterGeneric(); SearchParameterGeneric.ParameterList = new List <Tuple <string, string> >(); var x = ParameterName.Substring(ParameterName.IndexOf(Hl7.Fhir.Rest.SearchParams.SEARCH_CHAINSEPARATOR) + 1, (ParameterName.Length - ParameterName.IndexOf(Hl7.Fhir.Rest.SearchParams.SEARCH_CHAINSEPARATOR) - 1)); var ChainedSearchParam = new Tuple <string, string>(x, ParameterValue); SearchParameterGeneric.ParameterList.Add(ChainedSearchParam); FHIRAllTypes?TypeModifierResource = null; if (oSearchParameter.Modifier.HasValue && oSearchParameter.Modifier.Value == SearchParameter.SearchModifierCode.Type && !string.IsNullOrWhiteSpace(oSearchParameter.TypeModifierResource)) { //var ChainedSearchParam = new Tuple<string, string>(ParameterName.Split(Hl7.Fhir.Rest.SearchParams.SEARCH_CHAINSEPARATOR)[1], ParameterValue); TypeModifierResource = ModelInfo.FhirTypeNameToFhirType(oSearchParameter.TypeModifierResource).Value; } else { // If the chained reference has no Type modifier then their must be only one Target resource for the parameter! // The FHIR spec does allow the server to try and resolve resources for many resource targets in this case. Yet, the server must // reject the search if Resource instances are returned across more then one of the types for the search parameter. // This seams like a very fragile rule and would also be hard to implement given the current framework. // Therefore I am making a design decision that if more that one target resource is available for the given search // parameter and the user does not specify which by supplying a Type modifier, then I will reject the search parameter. if (oSearchParameter.TargetResourceTypeList != null && oSearchParameter.TargetResourceTypeList.Count == 1) { TypeModifierResource = ModelInfo.FhirTypeNameToFhirType(oSearchParameter.TargetResourceTypeList[0].ResourceType.GetLiteral()).Value; } else { if (oSearchParameter.TargetResourceTypeList != null && oSearchParameter.TargetResourceTypeList.Count > 1) { oSearchParameter.IsValid = false; oSearchParameter.InvalidMessage = $"The chained search parameter '{oSearchParameter.RawValue}' has no Type modifier specifying the target resource for the parameter and the parameter in use has many possible target resources. The search parameter must specify a target resource using the type modifier. For example '[base]/DiagnosticReport?subject:Patient.name=peter' where Patient is the Type modifier."; } else { throw new FormatException($"Server error: chained search parameter did not resolve to any target resource types. Parameter was: '{oSearchParameter.RawValue}' "); } } } ISearchParameterService SearchService = ISearchParameterServiceFactory.CreateSearchParameterService(); //oSearchParameter.ChainedSearchParameterList.Add(SearchService.ProcessResourceSearchParameters(SearchParameterGeneric, SearchParameterService.SearchParameterServiceType.Resource, TypeModifierResource.Value)); } else { if (oSearchParameter.Type == SearchParamType.Reference) { (oSearchParameter as SearchParameterReferance).AllowedReferanceResourceList = ServiceSearchParameterFactory.GetSearchParameterTargetResourceList(oSearchParameter); } if (!oSearchParameter.TryParseValue(ParameterValue)) { oSearchParameter.IsValid = false; } } return(oSearchParameter); }