private List <DtoServiceSearchParameterLight> GetSupportedSearchParameters(SearchParameterServiceType SearchParameterServiceType, OperationClass OperationClass, string ResourceType)
        {
            List <DtoServiceSearchParameterLight> DtoSupportedServiceSearchParameterList = new List <DtoServiceSearchParameterLight>();

            //For non Resource URL values, e.g _format, _summary
            if ((SearchParameterServiceType & SearchParameterServiceType.Base) == SearchParameterServiceType.Base)
            {
                DtoSupportedServiceSearchParameterList.AddRange(ServiceSearchParameterFactory.BaseSearchParameters());
            }
            //For Bundle URL Parameters e.g page, _sort
            if ((SearchParameterServiceType & SearchParameterServiceType.Bundle) == SearchParameterServiceType.Bundle)
            {
                DtoSupportedServiceSearchParameterList.AddRange(ServiceSearchParameterFactory.BundleSearchParameters());
            }

            //For $Operation URL Parameters e.g profile, mode
            if ((SearchParameterServiceType & SearchParameterServiceType.Operation) == SearchParameterServiceType.Operation)
            {
                DtoSupportedServiceSearchParameterList.AddRange(ServiceSearchParameterFactory.OperationSearchParameters(OperationClass));
            }

            //For Resource search parameters
            if ((SearchParameterServiceType & SearchParameterServiceType.Resource) == SearchParameterServiceType.Resource)
            {
                DtoSupportedServiceSearchParameterList.AddRange(IServiceSearchParameterCache.GetSearchParameterForResource(ResourceType));
            }

            return(DtoSupportedServiceSearchParameterList);
        }
Example #2
0
        private void AddIncludeResourceInstanceForIncludes(List <DtoResource> IncludeResourceList, HashSet <string> CacheResourceIDsAlreadyCollected, string FhirId)
        {
            //Don't source the same resource again from the Database if we already have it
            if (!CacheResourceIDsAlreadyCollected.Contains($"{IResourceRepository.RepositoryResourceType.GetLiteral()}-{FhirId}"))
            {
                IDatabaseOperationOutcome DatabaseOperationOutcomeIncludes = null;
                //Here we need to add compartment search, if we have a Compartment and id
                if (!string.IsNullOrWhiteSpace(this._Compartment) && !string.IsNullOrWhiteSpace(this._CompartmentId))
                {
                    //Here we need create a search parameter for _id={FhirId)
                    var IdSearchParameter                      = ServiceSearchParameterFactory.BaseResourceSearchParameters().SingleOrDefault(x => x.Name == "_id");
                    var IdParameterString                      = new Tuple <string, string>(IdSearchParameter.Name, FhirId);
                    ISearchParameterBase SearchParam           = ISearchParameterFactory.CreateSearchParameter(IdSearchParameter, IdParameterString);
                    PyroSearchParameters FhirIdSearchParameter = new PyroSearchParameters();
                    FhirIdSearchParameter.SearchParametersList = new List <ISearchParameterBase>();
                    FhirIdSearchParameter.SearchParametersList.Add(SearchParam);

                    //And now the Compartmnet Search parameters
                    PyroSearchParameters CompartmentSearchParameter = ICompartmentSearchParameterService.GetSearchParameters(this._Compartment, this._CompartmentId, IResourceRepository.RepositoryResourceType.GetLiteral());
                    DatabaseOperationOutcomeIncludes = IResourceRepository.GetResourceByCompartmentSearch(CompartmentSearchParameter, FhirIdSearchParameter, true);
                }
                else
                {
                    DatabaseOperationOutcomeIncludes = IResourceRepository.GetResourceByFhirID(FhirId, true, false);
                }

                var DtoIncludeResourceList = new List <DtoIncludeResource>();
                DatabaseOperationOutcomeIncludes.ReturnedResourceList.ForEach(x => DtoIncludeResourceList.Add(new DtoIncludeResource(x)));
                IncludeResourceList.AddRange(DtoIncludeResourceList);
                CacheResourceIDsAlreadyCollected.Add($"{IResourceRepository.RepositoryResourceType.GetLiteral()}-{FhirId}");
            }
        }
Example #3
0
        public void Seed()
        {
            IList <DtoServiceSearchParameter> DtoServiceSearchParameterList = ServiceSearchParameterFactory.FhirAPISearchParameters();
            var LastUpdated = DateTimeOffset.Now;

            foreach (var SearchParameter in DtoServiceSearchParameterList)
            {
                var ServiceSearchParameter = new DbModel.Entity._ServiceSearchParameter()
                {
                    Name        = SearchParameter.Name,
                    Description = SearchParameter.Description,
                    Expression  = SearchParameter.Expression,
                    Resource    = SearchParameter.Resource,
                    Type        = SearchParameter.Type,
                    Url         = SearchParameter.Url,
                    XPath       = SearchParameter.XPath,
                    IsIndexed   = true,
                    LastUpdated = LastUpdated,
                    Status      = PublicationStatus.Active
                };
                if (SearchParameter.TargetResourceTypeList != null && SearchParameter.TargetResourceTypeList.Count > 0)
                {
                    ServiceSearchParameter.TargetResourceTypeList = new List <_ServiceSearchParameterTargetResource>();
                    foreach (var ResourceTypeTarget in SearchParameter.TargetResourceTypeList)
                    {
                        ServiceSearchParameter.TargetResourceTypeList.Add(new _ServiceSearchParameterTargetResource()
                        {
                            ResourceType = ResourceTypeTarget.ResourceType
                        });
                    }
                }
                _Context.ServiceSearchParameter.Add(ServiceSearchParameter);
            }
            _Context.SaveChanges();
        }
        /// <summary>
        /// Get the search Parameters to seed the database on database creation.
        /// Only seed for Resource types 'Resource', 'Task', 'AuditEvent' and 'SearchParameter' as all others will be loaded by the server
        /// start-up task Pyro.Common.PyroHealthFhirResource.Tasks.SetSearchParameterDefinitions. We must however load these three
        /// now as they are required to index the search parameters for the Tasks resources and SearchParameter and AuditEvent resources loaded on start-up
        /// The Task SetSearchParameterDefinitions will update these search parameters table entries with their matching Resource Id and versions
        /// as the Task runs.
        /// </summary>
        /// <returns></returns>
        private IList <SearchParam> GetServiceSearchParameterList()
        {
            IList <DtoServiceSearchParameter> ServiceSearchParameterList = ServiceSearchParameterFactory.FhirAPISearchParameters();
            var ReturnList  = new List <SearchParam>();
            var LastUpdated = DateTimeOffset.Now;

            foreach (var SearchParameter in ServiceSearchParameterList.Where(x =>
                                                                             x.Resource == ResourceType.Resource.GetLiteral() ||
                                                                             x.Resource == ResourceType.Task.GetLiteral() ||
                                                                             x.Resource == ResourceType.SearchParameter.GetLiteral() ||
                                                                             x.Resource == ResourceType.AuditEvent.GetLiteral()))
            {
                var ServiceSearchParameter = new SearchParam()
                {
                    Name        = SearchParameter.Name,
                    Description = SearchParameter.Description,
                    Expression  = SearchParameter.Expression,
                    Resource    = SearchParameter.Resource,
                    Type        = SearchParameter.Type,
                    Url         = SearchParameter.Url,
                    XPath       = SearchParameter.XPath,
                    IsIndexed   = true,
                    LastUpdated = LastUpdated,
                    Status      = PublicationStatus.Active
                };
                if (SearchParameter.TargetResourceTypeList != null && SearchParameter.TargetResourceTypeList.Count > 0)
                {
                    foreach (var ResourceTypeTarget in SearchParameter.TargetResourceTypeList)
                    {
                        ServiceSearchParameter.TargetResourceTypeList.Add(new SParamResource()
                        {
                            ResourceType = ResourceTypeTarget.ResourceType
                        });
                    }
                }
                ReturnList.Add(ServiceSearchParameter);
            }
            return(ReturnList);
        }
Example #5
0
        private bool ValidateSearchParameterSupported(DtoServiceSearchParameterLight oSupported, ISearchParameterBase oInboundSearchParameter, IList <UnspportedSearchParameter> UnspportedSearchParameterList)
        {
            UnspportedSearchParameter DtoUnspportedSearchParameter = null;

            if (!oInboundSearchParameter.IsValid)
            {
                DtoUnspportedSearchParameter = InitaliseUnspportedParamerter(oInboundSearchParameter, DtoUnspportedSearchParameter);
                DtoUnspportedSearchParameter.ReasonMessage = DtoUnspportedSearchParameter.ReasonMessage + oInboundSearchParameter.InvalidMessage + ", ";
            }

            if (oInboundSearchParameter.Modifier.HasValue)
            {
                IList <SearchParameter.SearchModifierCode> oSupportedModifierList = Common.Tools.SearchParameterTools.GetModifiersForSearchType(oInboundSearchParameter.Type);
                if (!oSupportedModifierList.Contains(oInboundSearchParameter.Modifier.Value))
                {
                    DtoUnspportedSearchParameter = InitaliseUnspportedParamerter(oInboundSearchParameter, DtoUnspportedSearchParameter);
                    DtoUnspportedSearchParameter.ReasonMessage = DtoUnspportedSearchParameter.ReasonMessage + $"The parameter's modifier: '{oInboundSearchParameter.Modifier.ToString()}' is not supported by this server for the resource type '{oInboundSearchParameter.Resource.ToString()}', the whole parameter was : '{DtoUnspportedSearchParameter.RawParameter}', ";
                }
                if (oInboundSearchParameter.Modifier == SearchParameter.SearchModifierCode.Type)
                {
                    if (!ServiceSearchParameterFactory.GetSearchParameterTargetResourceList(oInboundSearchParameter).Contains(oInboundSearchParameter.TypeModifierResource))
                    {
                        DtoUnspportedSearchParameter = InitaliseUnspportedParamerter(oInboundSearchParameter, DtoUnspportedSearchParameter);
                        DtoUnspportedSearchParameter.ReasonMessage = DtoUnspportedSearchParameter.ReasonMessage + $"The search parameter modifier was expected to be a Fhir resource type that is supported for this search parameter. The Resource given was: {oInboundSearchParameter.TypeModifierResource} which is not supported for the search parameter '{oInboundSearchParameter.Name}.', ";
                    }
                }
            }

            if (!oInboundSearchParameter.ValidatePrefixes(oSupported))
            {
                DtoUnspportedSearchParameter = InitaliseUnspportedParamerter(oInboundSearchParameter, DtoUnspportedSearchParameter);
                string PreFixListString = string.Empty;
                Common.Tools.SearchParameterTools.GetPrefixListForSearchType(oSupported.Type).ForEach(x => PreFixListString = PreFixListString + "," + x);
                if (PreFixListString == string.Empty)
                {
                    PreFixListString = "(none)";
                }
                else
                {
                    PreFixListString = $"({PreFixListString})";
                }
                DtoUnspportedSearchParameter.ReasonMessage = DtoUnspportedSearchParameter.ReasonMessage + $"The one or more of the search parameter prefixes are not supported by this server against resource type of :'{oInboundSearchParameter.Resource.ToString()}', the whole parameter given was : '{DtoUnspportedSearchParameter.RawParameter}'. The prefixes that are supported are: {PreFixListString}, ";
            }

            if (oInboundSearchParameter.TypeModifierResource != null)
            {
                if (!ServiceSearchParameterFactory.GetSearchParameterTargetResourceList(oInboundSearchParameter).Contains(oInboundSearchParameter.TypeModifierResource))
                {
                    DtoUnspportedSearchParameter = InitaliseUnspportedParamerter(oInboundSearchParameter, DtoUnspportedSearchParameter);
                    DtoUnspportedSearchParameter.ReasonMessage = DtoUnspportedSearchParameter.ReasonMessage + String.Format("Unsupported search, the Resource type given as the Modifier is not supported. Resource type: '{0}' in parameter '{1}'., ", oInboundSearchParameter.TypeModifierResource.ToString(), oInboundSearchParameter.RawValue);
                }
            }

            if (DtoUnspportedSearchParameter != null)
            {
                UnspportedSearchParameterList.Add(DtoUnspportedSearchParameter);
                return(false);
            }
            else
            {
                UnspportedSearchParameterList.Clear();
                return(true);
            }
        }