示例#1
0
        public IResourceServiceOutcome Get(string BaseRequestUri, HttpRequestMessage Request, string ResourceName, string id)
        {
            using (DbContextTransaction Transaction = IUnitOfWork.BeginTransaction())
            {
                try
                {
                    System.Security.Principal.IPrincipal x = System.Threading.Thread.CurrentPrincipal;


                    IRequestServiceRootValidate.Validate(BaseRequestUri);
                    IRequestMeta            RequestMeta            = IRequestMetaFactory.CreateRequestMeta().Set(Request);
                    IResourceServiceOutcome ResourceServiceOutcome = IResourceApiServices.GetRead(id, RequestMeta);
                    ResourceServiceOutcome.SummaryType = RequestMeta.SearchParameterGeneric.SummaryType;


                    Common.BackgroundTask.Task.ITaskPayloadHiServiceIHISearch Payload = new Common.BackgroundTask.Task.TaskPayloadHiServiceIHISearch("ba58c03b-4ff6-4e86-8883-8851f40fb8f7", "92e74b38-1bb3-4e0c-b056-7ca7c1bd7810");
                    ResourceServiceOutcome.BackgroundTaskList.Add(Payload);

                    Transaction.Commit();
                    return(ResourceServiceOutcome);
                }
                catch (Exception Exec)
                {
                    Transaction.Rollback();
                    ILog.Error(Exec, $"PyroService.Get, Request: {Request.RequestUri.OriginalString}");
                    throw new PyroException(System.Net.HttpStatusCode.InternalServerError,
                                            Common.Tools.FhirOperationOutcomeSupport.Create(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.Exception, Exec.Message), Exec.Message);
                }
            }
        }
示例#2
0
        public IResourceServiceOutcome OperationGetResourceInstanceWithParameters(string BaseRequestUri, HttpRequestMessage Request, string ResourceName, string operation, string FhirId)
        {
            using (DbContextTransaction Transaction = IUnitOfWork.BeginTransaction())
            {
                try
                {
                    IRequestServiceRootValidate.Validate(BaseRequestUri);
                    IRequestMeta RequestMeta = IRequestMetaFactory.CreateRequestMeta().Set(Request);
                    IFhirResourceInstanceOperationService FhirResourceInstanceOperationService = IFhirResourceInstanceOperationServiceFactory.CreateFhirResourceInstanceOperationService();
                    IResourceServiceOutcome ResourceServiceOutcome = FhirResourceInstanceOperationService.ProcessGet(ResourceName, FhirId, operation, RequestMeta);
                    ResourceServiceOutcome.SummaryType = RequestMeta.SearchParameterGeneric.SummaryType;
                    if (ResourceServiceOutcome.SuccessfulTransaction)
                    {
                        Transaction.Commit();
                    }
                    else
                    {
                        Transaction.Rollback();
                    }

                    return(ResourceServiceOutcome);
                }
                catch (Exception Exec)
                {
                    Transaction.Rollback();
                    ILog.Error(Exec, $"PyroService.ResourceInstanceOperationWithParameters, Request: {Request.RequestUri.OriginalString}");
                    throw new PyroException(System.Net.HttpStatusCode.InternalServerError,
                                            Common.Tools.FhirOperationOutcomeSupport.Create(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.Exception, Exec.Message), Exec.Message);
                }
            }
        }
示例#3
0
 public DocumentBuilder(IJsonApiContext jsonApiContext, IRequestMeta requestMeta = null, IDocumentBuilderOptionsProvider documentBuilderOptionsProvider = null)
 {
     _jsonApiContext         = jsonApiContext;
     _contextGraph           = jsonApiContext.ContextGraph;
     _requestMeta            = requestMeta;
     _documentBuilderOptions = documentBuilderOptionsProvider?.GetDocumentBuilderOptions() ?? new DocumentBuilderOptions();;
 }
示例#4
0
 public IResourceServiceOutcome Base(string BaseRequestUri, HttpRequestMessage Request, Resource resource)
 {
     using (DbContextTransaction Transaction = IUnitOfWork.BeginTransaction())
     {
         try
         {
             IRequestServiceRootValidate.Validate(BaseRequestUri);
             IRequestMeta RequestMeta = IRequestMetaFactory.CreateRequestMeta().Set(Request);
             IBundleTransactionOperation BundleTransactionOperation = IBundleTransactionOperationFactory.CreateBundleTransactionOperation();
             IResourceServiceOutcome     ResourceServiceOutcome     = BundleTransactionOperation.Transact(resource, RequestMeta);
             ResourceServiceOutcome.SummaryType = RequestMeta.SearchParameterGeneric.SummaryType;
             if (ResourceServiceOutcome.SuccessfulTransaction)
             {
                 Transaction.Commit();
             }
             else
             {
                 Transaction.Rollback();
             }
             return(ResourceServiceOutcome);
         }
         catch (Exception Exec)
         {
             Transaction.Rollback();
             ILog.Error(Exec, $"PyroService.Base, Request: {Request.RequestUri.OriginalString}");
             throw new PyroException(System.Net.HttpStatusCode.InternalServerError,
                                     Common.Tools.FhirOperationOutcomeSupport.Create(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.Exception, Exec.Message), Exec.Message);
         }
     }
 }
示例#5
0
        public void Test_HISearchMedicareNumber()
        {
            IResourceServiceOutcomeFactory IResourceServiceOutcomeFactory = CommonTestSetup.TestSetupMocks.GetIResourceServiceOutcomeFactory();
            IPyroFhirUriFactory            IPyroFhirUriFactory            = CommonTestSetup.TestSetupMocks.GetIPyroFhirUriFactory();
            IResourceServices     IResourceServices     = GetIResourceServices();
            IGlobalProperties     IGlobalProperties     = CommonTestSetup.TestSetupMocks.GetIGlobalProperties();
            IHiServiceApi         IHiServiceApi         = GetMokIHiServiceApi();
            IMedicareNumberParser IMedicareNumberParser = new MedicareNumberParser();
            IIndividualHealthcareIdentifierParser IIndividualHealthcareIdentifierParser = new IndividualHealthcareIdentifierParser();
            IDVANumberParser    IDVANumberParser   = new DVANumberParser();
            IRequestMetaFactory RequestMetaFactory = CommonTestSetup.TestSetupMocks.GetIRequestMetaFactory();
            INationalHealthcareIdentifierInfo INationalHealthcareIdentifierInfo = new NationalHealthcareIdentifierInfo();
            IMedicareNumberInfo IMedicareNumberInfo = new MedicareNumberInfo();

            Common.PyroHealthFhirResource.CodeSystems.IPyroFhirServer IPyroFhirServerCodeSystem = new Common.PyroHealthFhirResource.CodeSystems.PyroFhirServer();


            IHISearchOrValidateOperation IHISearchOrValidateOperationService = new IHISearchOrValidateOperation(
                IResourceServiceOutcomeFactory,
                IResourceServices,
                IGlobalProperties,
                IHiServiceApi,
                RequestMetaFactory,
                IMedicareNumberParser,
                IIndividualHealthcareIdentifierParser,
                IDVANumberParser,
                INationalHealthcareIdentifierInfo,
                IMedicareNumberInfo,
                IPyroFhirServerCodeSystem);

            OperationClass OperationClass = new OperationClass()
            {
                Scope = Common.Enum.FhirOperationEnum.OperationScope.Resource,
                Type  = Common.Enum.FhirOperationEnum.OperationType.xIHISearchOrValidate
            };

            //var SearchParameterGeneric = new Common.Search.SearchParameterGeneric();

            var PyroRequestUri = CommonTestSetup.TestSetupMocks.GetIPyroRequestUriFactory().CreateFhirRequestUri();

            PyroRequestUri.FhirRequestUri = CommonTestSetup.TestSetupMocks.GetIPyroRequestUriFactory().CreateFhirRequestUri().FhirRequestUri = new Pyro.Common.Tools.UriSupport.PyroFhirUri(CommonTestSetup.TestSetupMocks.GetIPrimaryServiceRootCache());
            PyroRequestUri.FhirRequestUri.Parse($"{StaticTestData.FhirEndpoint()}/{ResourceType.Patient.GetLiteral()}/{Common.Enum.FhirOperationEnum.OperationType.xIHISearchOrValidate.GetPyroLiteral()}");
            IRequestMeta RequestMeta = RequestMetaFactory.CreateRequestMeta();

            RequestMeta.PyroRequestUri         = PyroRequestUri;
            RequestMeta.RequestHeader          = CommonTestSetup.TestSetupMocks.GetIRequestHeaderFactory().CreateRequestHeader();
            RequestMeta.SearchParameterGeneric = CommonTestSetup.TestSetupMocks.GetISearchParameterGenericFactory().CreateDtoSearchParameterGeneric();

            Parameters ParametersResource = GenerateRequestParametersResource();

            IResourceServiceOutcome ResourceServiceOutcome = IHISearchOrValidateOperationService.IHISearchOrValidate(
                OperationClass,
                ParametersResource,
                RequestMeta
                );

            Assert.NotNull(ResourceServiceOutcome.ResourceResult);
            Assert.AreEqual(ResourceType.Parameters.GetLiteral(), ResourceServiceOutcome.ResourceResult.TypeName);
        }
        public TokenGenerator(IOptions <JwtSettings> jwtSettings,
                              IUnitOfWork unitOfWork, IRequestMeta requestMeta)
        {
            _requestMeta = requestMeta;
            _unitOfWork  = unitOfWork;

            _jwtSettings = jwtSettings.Value;
        }
示例#7
0
 public MetaBuilder(IPaginationContext paginationContext, IJsonApiOptions options, IRequestMeta requestMeta = null,
                    ResourceDefinition <T> resourceDefinition = null)
 {
     _paginationContext = paginationContext;
     _options           = options;
     _requestMeta       = requestMeta;
     _resourceMeta      = resourceDefinition as IHasMeta;
 }
示例#8
0
 public IResourceServiceOutcome ProcessGet(
     string ResourceName,
     string FhirId,
     string OperationName,
     IRequestMeta RequestMeta)
 {
     return(Process(ResourceName, FhirId, OperationName, RequestMeta, null));
 }
示例#9
0
 public MetaBuilder(IPaginationContext paginationContext, IJsonApiOptions options, IRequestMeta requestMeta = null,
                    ResourceDefinition <TResource> resourceDefinition = null)
 {
     _paginationContext = paginationContext ?? throw new ArgumentNullException(nameof(paginationContext));
     _options           = options ?? throw new ArgumentNullException(nameof(options));
     _requestMeta       = requestMeta;
     _resourceMeta      = resourceDefinition as IHasMeta;
 }
示例#10
0
        private bool GetProcessing(Bundle.EntryComponent GetEntry, int GetEntryIndex)
        {
            IRequestMeta RequestMeta = IRequestMetaFactory.CreateRequestMeta();

            RequestMeta.Set(GetEntry.Request);
            RequestMeta.RequestHeader.Prefer = _RequestHeader.Prefer;

            IResourceServiceOutcome ResourceServiceOutcome = null;

            if (RequestMeta.SearchParameterGeneric.ParameterList.Count > 0)
            {
                ResourceServiceOutcome = IResourceServices.GetSearch(RequestMeta);
            }
            else
            {
                ResourceServiceOutcome = IResourceServices.GetRead(RequestMeta.PyroRequestUri.FhirRequestUri.ResourceId, RequestMeta);
            }

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

                if (ResourceServiceOutcome.ResourceResult != null)
                {
                    if (ResourceServiceOutcome.ResourceResult.ResourceType == ResourceType.OperationOutcome)
                    {
                        GetEntry.Response.Outcome = ResourceServiceOutcome.ResourceResult;
                    }
                    else
                    {
                        GetEntry.Resource = ResourceServiceOutcome.ResourceResult;
                    }
                }
                if (ResourceServiceOutcome.LastModified.HasValue)
                {
                    GetEntry.Response.Etag = HttpHeaderSupport.GetEntityTagHeaderValueFromVersion(ResourceServiceOutcome.ResourceVersionNumber).ToString();
                    if (ResourceServiceOutcome.IsDeleted.HasValue && !ResourceServiceOutcome.IsDeleted.Value)
                    {
                        GetEntry.Response.LastModified = ResourceServiceOutcome.LastModified;
                    }
                    GetEntry.Response.Location = FormatResponseLocation(RequestMeta.PyroRequestUri.FhirRequestUri.OriginalString, ResourceServiceOutcome.FhirResourceId, ResourceServiceOutcome.ResourceVersionNumber);
                }
                return(true);
            }
            else
            {
                if (ResourceServiceOutcome.ResourceResult != null && ResourceServiceOutcome.ResourceResult is OperationOutcome Op)
                {
                    IdentifieBatchEntityToClient(Op, GetEntry.FullUrl, "GET", GetEntryIndex);
                }
                _ServiceOperationOutcome = ResourceServiceOutcome;
                return(false);
            }
        }
示例#11
0
 public MetaBuilder(IPageService pageService,
                    IJsonApiOptions options,
                    IRequestMeta requestMeta = null,
                    ResourceDefinition <T> resourceDefinition = null)
 {
     _pageService  = pageService;
     _options      = options;
     _requestMeta  = requestMeta;
     _resourceMeta = resourceDefinition as IHasMeta;
 }
 public XFDocumentBuilder(
     IJsonApiContext jsonApiContext,
     IRequestMeta requestMeta = null,
     IDocumentBuilderOptionsProvider documentBuilderOptionsProvider = null,
     IScopedServiceProvider scopedServiceProvider = null)
 {
     _internalBuilder = new DocumentBuilder(jsonApiContext, requestMeta, documentBuilderOptionsProvider,
                                            scopedServiceProvider);
     _resourceGraph = jsonApiContext.ResourceGraph;
 }
 public DocumentBuilder(
     IJsonApiContext jsonApiContext,
     IRequestMeta requestMeta = null,
     IDocumentBuilderOptionsProvider documentBuilderOptionsProvider = null,
     IScopedServiceProvider scopedServiceProvider = null)
 {
     _jsonApiContext         = jsonApiContext;
     _resourceGraph          = jsonApiContext.ResourceGraph;
     _requestMeta            = requestMeta;
     _documentBuilderOptions = documentBuilderOptionsProvider?.GetDocumentBuilderOptions() ?? new DocumentBuilderOptions();
     _scopedServiceProvider  = scopedServiceProvider;
 }
        public IResourceServiceOutcome Initialize(OperationClass OperationClass, IRequestMeta RequestMeta, string FhirId)
        {
            if (OperationClass == null)
            {
                throw new NullReferenceException("OperationClass cannot be null.");
            }
            if (IResourceServices == null)
            {
                throw new NullReferenceException("ResourceServices cannot be null.");
            }
            if (RequestMeta == null)
            {
                throw new NullReferenceException("RequestMeta cannot be null.");
            }
            if (RequestMeta.PyroRequestUri == null)
            {
                throw new NullReferenceException("RequestUri cannot be null.");
            }
            if (RequestMeta.RequestHeader == null)
            {
                throw new NullReferenceException("RequestHeaders cannot be null.");
            }
            if (RequestMeta.SearchParameterGeneric == null)
            {
                throw new NullReferenceException("SearchParameterGeneric cannot be null.");
            }

            ResourceServiceOutcome = IResourceServiceOutcomeFactory.CreateResourceServiceOutcome();



            var ResourceRepository = IRepositorySwitcher.GetRepository(FHIRAllTypes.Patient);



            List <Resource> ResourceList = new List <Resource>();

            if (ResourceList.Count > 0)
            {
                Bundle TransactionBundle  = GenerateTransactionBundle(ResourceList);
                var    CurrentRequestMeta = IRequestMetaFactory.CreateRequestMeta().Set($"{FHIRAllTypes.Bundle.GetLiteral()}/{TransactionBundle.Id}");
                IResourceServiceOutcome ResourceServiceOutcome = IBundleTransactionOperation.Transact(TransactionBundle, CurrentRequestMeta);
                return(ResourceServiceOutcome);
            }


            //  var OutCome = IResourceServices.Put(Res.Id, Res, CurrentRequestMeta);

            //var ResourceRepository = IRepositorySwitcher.GetRepository(FHIRAllTypes.Patient);


            return(ResourceServiceOutcome);
        }
示例#15
0
 public IResourceServiceOutcome ProcessPost(
     string ResourceName,
     string FhirId,
     string OperationName,
     IRequestMeta RequestMeta,
     Resource Resource)
 {
     if (Resource == null)
     {
         throw new NullReferenceException("Resource cannot be null.");
     }
     return(Process(ResourceName, FhirId, OperationName, RequestMeta, Resource));
 }
示例#16
0
        public Resource ResolveByCanonicalUri(string uri)
        {
            IRequestMeta            RequestMeta            = IRequestMetaFactory.CreateRequestMeta().Set($"{ResourceType.StructureDefinition.GetLiteral()}?url={uri}");
            IResourceServiceOutcome ResourceServiceOutcome = IResourceServices.GetSearch(RequestMeta);

            if (ResourceServiceOutcome.ResourceResult != null && (ResourceServiceOutcome.ResourceResult as Bundle).Entry.Count > 1)
            {
                throw new System.Exception($"More than a single {ResourceType.StructureDefinition.GetLiteral()} instance was found with the Canonical Uri of {uri} at the endpoint {RequestMeta.PyroRequestUri.FhirRequestUri.OriginalString}.");
            }
            else if (ResourceServiceOutcome.ResourceResult != null && ResourceServiceOutcome.ResourceResult is Bundle bundle && bundle.Entry.Count == 1)
            {
                return(bundle.Entry[0].Resource);
            }
        private bool SetSearchParameterServerIndex(string Id)
        {
            string     ResourceName = ResourceType.SearchParameter.GetLiteral();
            Parameters Parameters   = new Parameters();

            Parameters.Parameter = new List <Parameters.ParameterComponent>();
            var ParameterComponent = new Parameters.ParameterComponent();

            Parameters.Parameter.Add(ParameterComponent);
            ParameterComponent.Name = $"{ResourceName}";
            var          Ref             = new ResourceReference();
            IRequestMeta RequestMetaTemp = IRequestMetaFactory.CreateRequestMeta().Set($"{ResourceName}/{Id}");

            Ref.Reference            = $"{RequestMetaTemp.PyroRequestUri.FhirRequestUri.OriginalString}";
            ParameterComponent.Value = Ref;
            string       OperationName = FhirOperationEnum.OperationType.ServerIndexesSet.GetPyroLiteral();
            IRequestMeta RequestMeta   = IRequestMetaFactory.CreateRequestMeta().Set("");

            try
            {
                IFhirBaseOperationService FhirBaseOperationService = IFhirBaseOperationServiceFactory.CreateFhirBaseOperationService();
                IResourceServiceOutcome   ResourceServiceOutcome   = IServerSearchParameterOperation.ProcessSet(RequestMeta.PyroRequestUri, RequestMeta.SearchParameterGeneric, Parameters, true);
                if (ResourceServiceOutcome.HttpStatusCode == System.Net.HttpStatusCode.OK)
                {
                    return(true);
                }
                else
                {
                    string OperationOutcomeMessage = string.Empty;
                    if (ResourceServiceOutcome.ResourceResult != null && ResourceServiceOutcome.ResourceResult is OperationOutcome OptOut)
                    {
                        OptOut.Issue.ForEach(x => OperationOutcomeMessage = OperationOutcomeMessage + " " + x.Details.Text);
                        string Message = $"Internal Server Error: Failed to Set SearchParameter Server index calling operation ${OperationName} with the SearchParmeter Resource {RequestMetaTemp.PyroRequestUri.FhirRequestUri.OriginalString} with extra detail: {OperationOutcomeMessage}";
                        ILog.Error(Message);
                        throw new Exception(Message);
                    }
                    else
                    {
                        string Message = $"Internal Server Error: Failed to Set SearchParameter Server index calling operation ${OperationName} with the SearchParmeter Resource {RequestMetaTemp.PyroRequestUri.FhirRequestUri.OriginalString}";
                        ILog.Error(Message);
                        throw new Exception(Message);
                    }
                }
            }
            catch (Exception Exec)
            {
                string Message = $"{Exec.Message},  Internal Server Error: Failed to Set SearchParameter Server index calling operation ${OperationName}";
                ILog.Error(Exec, Message);
                throw new Exception(Message);
            }
        }
示例#18
0
        private bool DeleteProcessing(Bundle.EntryComponent DeleteEntry, int DeleteEntryIndex)
        {
            IRequestMeta RequestMeta = IRequestMetaFactory.CreateRequestMeta().Set(DeleteEntry.Request);

            RequestMeta.RequestHeader.Prefer = _RequestHeader.Prefer;
            IResourceServiceOutcome ResourceServiceOutcome = null;

            if (RequestMeta.SearchParameterGeneric.ParameterList.Count > 0)
            {
                ResourceServiceOutcome = IResourceServices.ConditionalDelete(RequestMeta);
            }
            else
            {
                ResourceServiceOutcome = IResourceServices.Delete(RequestMeta.PyroRequestUri.FhirRequestUri.ResourceId, RequestMeta);
            }

            if (ResourceServiceOutcome.SuccessfulTransaction)
            {
                DeleteEntry.Response        = new Bundle.ResponseComponent();
                DeleteEntry.Response.Status = FormatHTTPStatusCodeAsString(ResourceServiceOutcome.HttpStatusCode);
                DeleteEntry.FullUrl         = null;
                if (ResourceServiceOutcome.ResourceResult != null)
                {
                    if (ResourceServiceOutcome.ResourceResult.ResourceType == ResourceType.OperationOutcome)
                    {
                        DeleteEntry.Response.Outcome = ResourceServiceOutcome.ResourceResult;
                    }
                    else
                    {
                        DeleteEntry.Resource = ResourceServiceOutcome.ResourceResult;
                    }
                }
                if (ResourceServiceOutcome.LastModified != null && ResourceServiceOutcome.ResourceVersionNumber != null)
                {
                    DeleteEntry.Response.Etag         = HttpHeaderSupport.GetEntityTagHeaderValueFromVersion(ResourceServiceOutcome.ResourceVersionNumber).ToString();
                    DeleteEntry.Response.LastModified = ResourceServiceOutcome.LastModified;
                }
                return(true);
            }
            else
            {
                if (ResourceServiceOutcome.ResourceResult != null && ResourceServiceOutcome.ResourceResult is OperationOutcome Op)
                {
                    IdentifieBatchEntityToClient(Op, DeleteEntry.FullUrl, "DELETE", DeleteEntryIndex);
                }
                _ServiceOperationOutcome = ResourceServiceOutcome;
                return(false);
            }
        }
示例#19
0
        public IResourceServiceOutcome SetInActive(OperationClass OperationClass, IRequestMeta RequestMeta, string FhirId)
        {
            ResourceServiceOutcome = IResourceServiceOutcomeFactory.CreateResourceServiceOutcome();
            CompartmentDefinition CompartDef = GetCompartmentResource(FhirId);

            if (CompartDef != null)
            {
                var DbServiceCompartment = IServiceCompartmentRepository.GetServiceCompartmentByFhirId(CompartDef.Id);
                if (DbServiceCompartment != null)
                {
                    IServiceCompartmentRepository.DeleteServiceCompartment(DbServiceCompartment.Code);
                    ClearCompartmentCache(DbServiceCompartment.Code);
                }
                //Regadless of the Compartment being there or not we return NoContent when it is deleted.
                ResourceServiceOutcome.HttpStatusCode        = System.Net.HttpStatusCode.NoContent;
                ResourceServiceOutcome.FhirResourceId        = null;
                ResourceServiceOutcome.LastModified          = null;
                ResourceServiceOutcome.IsDeleted             = null;
                ResourceServiceOutcome.OperationType         = RestEnum.CrudOperationType.Delete;
                ResourceServiceOutcome.ResourceVersionNumber = null;
                ResourceServiceOutcome.RequestUri            = RequestMeta.PyroRequestUri.FhirRequestUri;
                ResourceServiceOutcome.SuccessfulTransaction = true;
                return(ResourceServiceOutcome);
            }
            else
            {
                //Not CompartmentDefinition Resource found
                ResourceServiceOutcome.ResourceResult = Common.Tools.FhirOperationOutcomeSupport.Create(OperationOutcome.IssueSeverity.Fatal, OperationOutcome.IssueType.NotSupported,
                                                                                                        $"The resource id supplied to the ${FhirOperationEnum.OperationType.xSetCompartmentActive.GetPyroLiteral()} operation was not found in the server at: {ResourceType.CompartmentDefinition.GetLiteral()}/{FhirId}");
                ResourceServiceOutcome.HttpStatusCode        = System.Net.HttpStatusCode.NotFound;
                ResourceServiceOutcome.FhirResourceId        = null;
                ResourceServiceOutcome.LastModified          = null;
                ResourceServiceOutcome.IsDeleted             = null;
                ResourceServiceOutcome.OperationType         = RestEnum.CrudOperationType.Read;
                ResourceServiceOutcome.ResourceVersionNumber = null;
                ResourceServiceOutcome.RequestUri            = RequestMeta.PyroRequestUri.FhirRequestUri;
                ResourceServiceOutcome.HttpStatusCode        = System.Net.HttpStatusCode.NotFound;
                ResourceServiceOutcome.SuccessfulTransaction = true;
                return(ResourceServiceOutcome);
            }
        }
示例#20
0
 public IResourceServiceOutcome PostFormSearch(string BaseRequestUri, HttpRequestMessage Request, string ResourceName, IEnumerable <Tuple <string, string> > FormParameterList)
 {
     using (DbContextTransaction Transaction = IUnitOfWork.BeginTransaction())
     {
         try
         {
             IRequestMeta            RequestMeta            = IRequestMetaFactory.CreateRequestMeta().Set(Request, SearchParams.FromUriParamList(FormParameterList));
             IResourceServiceOutcome ResourceServiceOutcome = IResourceApiServices.GetSearch(RequestMeta);
             ResourceServiceOutcome.SummaryType = RequestMeta.SearchParameterGeneric.SummaryType;
             Transaction.Commit();
             return(ResourceServiceOutcome);
         }
         catch (Exception Exec)
         {
             Transaction.Rollback();
             ILog.Error(Exec, $"PyroService.PostFormSearch, Request: {Request.RequestUri.OriginalString}");
             throw new PyroException(System.Net.HttpStatusCode.InternalServerError,
                                     Common.Tools.FhirOperationOutcomeSupport.Create(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.Exception, Exec.Message), Exec.Message);
         }
     }
 }
示例#21
0
        public List <QuestionnaireResults> ProcessAttendeeResults()
        {
            var ResultList = new List <QuestionnaireResults>();
            //First get the Primary Answers
            IRequestMeta RequestMeta = IRequestMetaFactory.CreateRequestMeta().Set($"{FHIRAllTypes.QuestionnaireResponse.GetLiteral()}/{_PrimaryQuestionnaireResponseAnswerResourceId}");
            var          Answers     = this.IResourceServices.GetRead(_PrimaryQuestionnaireResponseAnswerResourceId, RequestMeta);

            if (Answers.SuccessfulTransaction && Answers.ResourceResult != null && Answers.ResourceResult is QuestionnaireResponse QuestionnaireResponseAnswers)
            {
                //Now get the Attendee's answers
                string       SearchQuery = $"questionnaire=Questionnaire/{_QuestionnaireResourceId}";
                IRequestMeta RequestMetaQuestionnaireResource = IRequestMetaFactory.CreateRequestMeta().Set($"{FHIRAllTypes.QuestionnaireResponse.GetLiteral()}?{SearchQuery}");
                var          AttendeeAnswers = this.IResourceServices.GetSearch(RequestMetaQuestionnaireResource);
                if (AttendeeAnswers.SuccessfulTransaction && AttendeeAnswers.ResourceResult != null && AttendeeAnswers.ResourceResult is Bundle AttendeeAnswersBundle)
                {
                    foreach (var Entry in AttendeeAnswersBundle.Entry)
                    {
                        QuestionnaireResponse QuestionnaireResponseAttendee = Entry.Resource as QuestionnaireResponse;
                        if (QuestionnaireResponseAttendee.Source != null && !string.IsNullOrWhiteSpace(QuestionnaireResponseAttendee.Source.Reference))
                        {
                            if (QuestionnaireResponseAttendee.Source.Url != null)
                            {
                            }
                            else
                            {
                                string Ref = QuestionnaireResponseAttendee.Source.Reference;
                            }
                        }

                        QuestionnaireResults QuestionnaireResults = QuestionnaireResponseChecker.Check(QuestionnaireResponseAnswers, QuestionnaireResponseAttendee);
                        ResultList.Add(QuestionnaireResults);
                    }
                }
            }
            else
            {
                throw new Exception($"Could not resolve the primary Answer QuestionnaireResponse resource with id = {_PrimaryQuestionnaireResponseAnswerResourceId}");
            }
            return(ResultList);
        }
示例#22
0
 public IResourceServiceOutcome CompartmentSearch(string BaseRequestUri, HttpRequestMessage Request, string Compartment, string id, string ResourceName)
 {
     using (DbContextTransaction Transaction = IUnitOfWork.BeginTransaction())
     {
         try
         {
             IRequestServiceRootValidate.Validate(BaseRequestUri);
             IRequestMeta            RequestMeta            = IRequestMetaFactory.CreateRequestMeta().Set(Request);
             IResourceServiceOutcome ResourceServiceOutcome = IResourceApiServices.GetCompartmentSearch(RequestMeta, Compartment, id, ResourceName);
             ResourceServiceOutcome.SummaryType = RequestMeta.SearchParameterGeneric.SummaryType;
             Transaction.Commit();
             return(ResourceServiceOutcome);
         }
         catch (Exception Exec)
         {
             Transaction.Rollback();
             ILog.Error(Exec, $"PyroService.CompartmentSearch, Request: {Request.RequestUri.OriginalString}");
             throw new PyroException(System.Net.HttpStatusCode.InternalServerError,
                                     Common.Tools.FhirOperationOutcomeSupport.Create(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.Exception, Exec.Message), Exec.Message);
         }
     }
 }
示例#23
0
文件: PyroService.cs 项目: eug48/Pyro
 public IResourceServiceOutcome Metadata(string BaseRequestUri, HttpRequestMessage Request)
 {
     using (DbContextTransaction Transaction = IUnitOfWork.BeginTransaction())
     {
         try
         {
             IRequestServiceRootValidate.Validate(BaseRequestUri);
             IRequestMeta            RequestMeta            = IRequestMetaFactory.CreateRequestMeta().Set(Request);
             IMetadataService        MetadataService        = IMetadataServiceFactory.CreateMetadataService();
             IResourceServiceOutcome ResourceServiceOutcome = MetadataService.GetServersConformanceResource(RequestMeta);
             ResourceServiceOutcome.SummaryType = RequestMeta.SearchParameterGeneric.SummaryType;
             Transaction.Commit();
             return(ResourceServiceOutcome);
         }
         catch (Exception Exec)
         {
             Transaction.Rollback();
             ILog.Error(Exec, "PyroService.Metadata");
             throw new PyroException(System.Net.HttpStatusCode.InternalServerError,
                                     Common.Tools.FhirOperationOutcomeSupport.Create(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.Exception, Exec.Message), Exec.Message);
         }
     }
 }
示例#24
0
        public void Run(ITaskPayloadHiServiceIHISearch TaskPayloadHiServiceIHISearch)
        {
            using (DbContextTransaction Transaction = IUnitOfWork.BeginTransaction())
            {
                try
                {
                    IRequestMeta            RequestMeta            = IRequestMetaFactory.CreateRequestMeta().Set("Patient/IHIStatusExample");
                    IResourceServiceOutcome ResourceServiceOutcome = IResourceApiServices.GetRead("IHIStatusExample", RequestMeta);
                    ResourceServiceOutcome.SummaryType = RequestMeta.SearchParameterGeneric.SummaryType;

                    Transaction.Commit();


                    ConsoleSupport.TimeStampWriteLine(LogMessageSupport.TaskOutCome(TaskPayloadHiServiceIHISearch, Hl7.Fhir.Model.Task.TaskStatus.Completed));
                }
                catch (Exception Exec)
                {
                    Transaction.Rollback();
                    ConsoleSupport.TimeStampWriteLine(LogMessageSupport.TaskException(TaskPayloadHiServiceIHISearch, Hl7.Fhir.Model.Task.TaskStatus.Failed));
                    ILog.Error(Exec, $"FHIR Task ID: {TaskPayloadHiServiceIHISearch.TaskId}, FHIR Patient ID: {TaskPayloadHiServiceIHISearch.PatientId}");
                }
            }
        }
示例#25
0
        public IResourceServiceOutcome Transact(Resource Resource, IRequestMeta RequestMeta)
        {
            if (IResourceServices == null)
            {
                throw new ArgumentNullException("IResourceServices can not be null.");
            }
            if (Resource == null)
            {
                throw new ArgumentNullException("Resource can not be null.");
            }
            if (RequestMeta == null)
            {
                throw new ArgumentNullException("RequestMeta can not be null.");
            }

            _RequestHeader = RequestMeta.RequestHeader ?? throw new ArgumentNullException("RequestHeaders can not be null.");
            _RequestUri    = RequestMeta.PyroRequestUri ?? throw new ArgumentNullException("RequestUri can not be null.");

            _ServiceOperationOutcome = IResourceServiceOutcomeFactory.CreateResourceServiceOutcome();
            _ServiceOperationOutcome.HttpStatusCode = System.Net.HttpStatusCode.OK;
            Bundle bundle = Resource as Bundle;

            if (bundle == null)
            {
                var Message   = $"The FHIR server's service root endpoint can only accept 'Bundle' resources. Resource received was: {Resource.ResourceType.ToString()}";
                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(_ServiceOperationOutcome);
            }
            else if (bundle.Type != Bundle.BundleType.Transaction || (bundle.Type != Bundle.BundleType.Transaction && bundle.Type != Bundle.BundleType.Batch))
            {
                var Message   = $"The FHIR server's service root endpoint can only accept Bundle resources of Bundle.type = 'Transaction' or Bundle.type = 'Batch'. Type found was {bundle.Type.ToString()}";
                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(_ServiceOperationOutcome);
            }
            else
            {
                bundle.Type = Bundle.BundleType.TransactionResponse;
                bundle.Id   = Guid.NewGuid().ToString();
                if (bundle.Meta == null)
                {
                    bundle.Meta = new Meta();
                }
                bundle.Meta.LastUpdated = DateTimeOffset.Now;


                //FHIR Spec: http://build.fhir.org/bundle.html#transaction
                //  If there is no request element, then there SHALL be a resource and the server must infer
                //  whether this is a create or an update from the resource identity supplied.
                //  NO Request Processing
                foreach (var NoRequestEntry in bundle.Entry.Where(x => x.Request == null || !x.Request.Method.HasValue))
                {
                    NoRequestEntry.Request = GenerateRequestComponentForEntry(NoRequestEntry);
                }

                //All entries with a Request, should be all at this point
                var EntryWithRequestList            = bundle.Entry.Where(x => x.Request != null && x.Request.Method.HasValue);
                var EntryWithResourceAndRequestList = EntryWithRequestList.Where(x => x.Resource != null);

                var DeleteEntries = EntryWithRequestList.Where(x => x.Request.Method == Bundle.HTTPVerb.DELETE);
                var POSTEntries   = EntryWithResourceAndRequestList.Where(x => x.Request.Method == Bundle.HTTPVerb.POST);
                var PUTEntries    = EntryWithResourceAndRequestList.Where(x => x.Request.Method == Bundle.HTTPVerb.PUT);
                var GETEntries    = EntryWithRequestList.Where(x => x.Request.Method == Bundle.HTTPVerb.GET);

                try
                {
                    //DELETE Processing
                    for (int i = 0; i < DeleteEntries.Count(); i++)
                    {
                        if (!DeleteProcessing(DeleteEntries.ElementAt(i), i))
                        {
                            return(_ServiceOperationOutcome);
                        }
                    }

                    //Assign new id's for POSTs and then update all POST and PUT entrie referances
                    AssignResourceIdsAndUpdateReferances(POSTEntries, PUTEntries);

                    //POST Processing
                    for (int i = 0; i < POSTEntries.Count(); i++)
                    {
                        if (!PostProcessing(POSTEntries.ElementAt(i), i))
                        {
                            _ServiceOperationOutcome.SuccessfulTransaction = false;
                            return(_ServiceOperationOutcome);
                        }
                    }

                    //PUT Processing
                    for (int i = 0; i < PUTEntries.Count(); i++)
                    {
                        if (!PutProcessing(PUTEntries.ElementAt(i), i))
                        {
                            _ServiceOperationOutcome.SuccessfulTransaction = false;
                            return(_ServiceOperationOutcome);
                        }
                    }

                    //GET Processing
                    for (int i = 0; i < GETEntries.Count(); i++)
                    {
                        if (!GetProcessing(GETEntries.ElementAt(i), i))
                        {
                            _ServiceOperationOutcome.SuccessfulTransaction = false;
                            return(_ServiceOperationOutcome);
                        }
                    }

                    _ServiceOperationOutcome.ResourceResult        = bundle;
                    _ServiceOperationOutcome.HttpStatusCode        = System.Net.HttpStatusCode.OK;
                    _ServiceOperationOutcome.OperationType         = Enum.RestEnum.CrudOperationType.Update;
                    _ServiceOperationOutcome.SuccessfulTransaction = true;
                }
                catch (Exception Exec)
                {
                    throw new PyroException(System.Net.HttpStatusCode.InternalServerError, FhirOperationOutcomeSupport.Create(OperationOutcome.IssueSeverity.Error, OperationOutcome.IssueType.Exception, Exec.Message), Exec.Message);
                }
            }

            return(_ServiceOperationOutcome);
        }
示例#26
0
        public IResourceServiceOutcome GetServersConformanceResource(IRequestMeta RequestMeta)
        {
            if (RequestMeta == null)
            {
                throw new NullReferenceException("RequestMeta can not be null.");
            }
            if (RequestMeta.SearchParameterGeneric == null)
            {
                throw new NullReferenceException("SearchParameterGeneric can not be null.");
            }

            IResourceServiceOutcome         ServiceOperationOutcome        = IResourceServiceOutcomeFactory.CreateResourceServiceOutcome();
            ISearchParameterService         SearchService                  = ISearchParameterServiceFactory.CreateSearchParameterService();
            ISearchParametersServiceOutcome SearchParametersServiceOutcome = SearchService.ProcessBaseSearchParameters(RequestMeta.SearchParameterGeneric);

            if (SearchParametersServiceOutcome.FhirOperationOutcome != null)
            {
                ServiceOperationOutcome.ResourceResult = SearchParametersServiceOutcome.FhirOperationOutcome;
                ServiceOperationOutcome.HttpStatusCode = SearchParametersServiceOutcome.HttpStatusCode;
                ServiceOperationOutcome.FormatMimeType = SearchParametersServiceOutcome.SearchParameters.Format;
                return(ServiceOperationOutcome);
            }

            var    Conformance            = new CapabilityStatement();
            var    ApplicationReleaseDate = new DateTimeOffset(2017, 10, 17, 6, 00, 00, new TimeSpan(8, 0, 0));
            string ServerName             = "Pyro Server";
            string Https = "https://";

            Conformance.Id               = "metadata";
            Conformance.Url              = $"{Https}{IPrimaryServiceRootCache.GetPrimaryRootUrlFromDatabase().Url}/metadata";
            Conformance.Version          = $"V{IGlobalProperties.ApplicationVersionInfo}";
            Conformance.Meta             = new Meta();
            Conformance.Meta.LastUpdated = ApplicationReleaseDate;
            Conformance.Name             = ServerName;
            Conformance.Status           = PublicationStatus.Active;
            Conformance.Experimental     = true;
            Conformance.Date             = (new FhirDateTime(ApplicationReleaseDate)).Value;
            Conformance.Publisher        = "PyroHealth.net";
            var AngusContactDetail = Common.PyroHealthInformation.PyroHealthContactDetailAngusMillar.GetContactDetail();

            Conformance.Contact = new List <ContactDetail>()
            {
                AngusContactDetail
            };

            Conformance.Description = new Markdown("Conformance statement for the " + ServerName);

            var Australia = new CodeableConcept("urn:iso:std:iso:3166", "AU", "Australia");

            Conformance.Jurisdiction = new List <CodeableConcept>()
            {
                Australia
            };

            Conformance.Purpose = new Markdown("FHIR Server reference implementation");

            Conformance.Copyright = new Markdown("Copyright: PyroHealth.net");
            Conformance.Kind      = CapabilityStatement.CapabilityStatementKind.Instance;

            Conformance.Software             = new CapabilityStatement.SoftwareComponent();
            Conformance.Software.Name        = ServerName;
            Conformance.Software.Version     = IGlobalProperties.ApplicationVersionInfo; //To align with FHIR version only use number no prefix of 'V'
            Conformance.Software.ReleaseDate = (new FhirDateTime(ApplicationReleaseDate)).Value;

            Conformance.Implementation             = new CapabilityStatement.ImplementationComponent();
            Conformance.Implementation.Description = $"{ServerName} is an implementation of a FHIR server supporting V{Hl7.Fhir.Model.ModelInfo.Version} of the specification. This instance is a publicly available testing server and its resource may be cleared at any time.";
            Conformance.Implementation.Url         = $"{Https}{IPrimaryServiceRootCache.GetPrimaryRootUrlFromDatabase().Url}";

            Conformance.FhirVersion   = Hl7.Fhir.Model.ModelInfo.Version; //Must be formated as just the number '3.0.1' as touchstone does not like the V3.0.1
            Conformance.AcceptUnknown = CapabilityStatement.UnknownContentCode.Extensions;

            var ContentFormatList = new List <string>();

            foreach (var mediaType in Hl7.Fhir.Rest.ContentType.XML_CONTENT_HEADERS)
            {
                ContentFormatList.Add(mediaType);
            }
            foreach (var mediaType in Hl7.Fhir.Rest.ContentType.JSON_CONTENT_HEADERS)
            {
                ContentFormatList.Add(mediaType);
            }
            Conformance.Format = ContentFormatList;

            Conformance.Rest = new List <CapabilityStatement.RestComponent>();
            var RestComponent = new CapabilityStatement.RestComponent();

            Conformance.Rest.Add(RestComponent);
            RestComponent.Mode                 = CapabilityStatement.RestfulCapabilityMode.Server;
            RestComponent.Documentation        = $"STU{Hl7.Fhir.Model.ModelInfo.Version.Split('.')[0]} V{Hl7.Fhir.Model.ModelInfo.Version} FHIR Server";
            RestComponent.Security             = new CapabilityStatement.SecurityComponent();
            RestComponent.Security.Description = "No Security has been implemented, server if publicly open";

            RestComponent.Interaction = new List <CapabilityStatement.SystemInteractionComponent>();
            var SystemInteractionComponent = new CapabilityStatement.SystemInteractionComponent();

            RestComponent.Interaction.Add(SystemInteractionComponent);
            SystemInteractionComponent.Code          = CapabilityStatement.SystemRestfulInteraction.Transaction;
            SystemInteractionComponent.Documentation = "Batch Transaction supports all request methods (Delete, POST, PUT, GET) including conditional create/update/delete. Operatons are not supported within Transaction bundles.";

            var CompartmentList = IServiceCompartmentRepository.GetAllServiceCompartments();

            if (CompartmentList != null && CompartmentList.Count > 0)
            {
                var CompartmentUrlList = new List <string>();
                CompartmentList.ForEach(x => CompartmentUrlList.Add(x.Url));
                RestComponent.Compartment = CompartmentUrlList;
            }

            RestComponent.Resource = new List <CapabilityStatement.ResourceComponent>();

            List <DtoServiceSearchParameterHeavy> DtoServiceSearchParameterHeavyList = IServiceSearchParameterService.GetServiceSearchParametersHeavy(false);

            var ResourceTypeList = Enum.GetValues(typeof(ResourceType));

            foreach (ResourceType ResourceType in ResourceTypeList)
            {
                string       CurrentResourceString = ResourceType.GetLiteral();
                FHIRAllTypes?FhirType          = Hl7.Fhir.Model.ModelInfo.FhirTypeNameToFhirType(CurrentResourceString);
                var          ResourceComponent = new CapabilityStatement.ResourceComponent();
                RestComponent.Resource.Add(ResourceComponent);
                ResourceComponent.Type        = ResourceType;
                ResourceComponent.Interaction = new List <CapabilityStatement.ResourceInteractionComponent>()
                {
                    new CapabilityStatement.ResourceInteractionComponent()
                    {
                        Code = CapabilityStatement.TypeRestfulInteraction.Create
                    },
                    new CapabilityStatement.ResourceInteractionComponent()
                    {
                        Code = CapabilityStatement.TypeRestfulInteraction.Delete
                    },
                    new CapabilityStatement.ResourceInteractionComponent()
                    {
                        Code = CapabilityStatement.TypeRestfulInteraction.Read
                    },
                    new CapabilityStatement.ResourceInteractionComponent()
                    {
                        Code = CapabilityStatement.TypeRestfulInteraction.Update
                    },
                    new CapabilityStatement.ResourceInteractionComponent()
                    {
                        Code = CapabilityStatement.TypeRestfulInteraction.Vread
                    },
                    new CapabilityStatement.ResourceInteractionComponent()
                    {
                        Code = CapabilityStatement.TypeRestfulInteraction.SearchType
                    },
                    new CapabilityStatement.ResourceInteractionComponent()
                    {
                        Code = CapabilityStatement.TypeRestfulInteraction.HistoryInstance
                    },
                    new CapabilityStatement.ResourceInteractionComponent()
                    {
                        Code = CapabilityStatement.TypeRestfulInteraction.HistoryType
                    }
                    //new Conformance.ResourceInteractionComponent() { Code = Conformance.TypeRestfulInteraction.HistoryType},
                };
                ResourceComponent.Versioning        = CapabilityStatement.ResourceVersionPolicy.Versioned;
                ResourceComponent.ReadHistory       = true;
                ResourceComponent.UpdateCreate      = true;
                ResourceComponent.ConditionalCreate = true;
                ResourceComponent.ConditionalRead   = CapabilityStatement.ConditionalReadStatus.FullSupport;
                ResourceComponent.ConditionalUpdate = true;
                ResourceComponent.ConditionalDelete = CapabilityStatement.ConditionalDeleteStatus.Multiple;


                var ReferenceHandlingPolicyList = new List <CapabilityStatement.ReferenceHandlingPolicy?>();
                ReferenceHandlingPolicyList.Add(CapabilityStatement.ReferenceHandlingPolicy.Literal);
                ReferenceHandlingPolicyList.Add(CapabilityStatement.ReferenceHandlingPolicy.Local);
                ResourceComponent.ReferencePolicy = ReferenceHandlingPolicyList;

                List <DtoServiceSearchParameterHeavy> DtoServiceSearchParameterHeavyForResourceList = DtoServiceSearchParameterHeavyList.Where(x => x.Resource == CurrentResourceString || x.Resource == FHIRAllTypes.Resource.GetLiteral()).ToList();

                //List<ServiceSearchParameterHeavy> DtoServiceSearchParameterHeavyForResourceList = ICommonServices.GetServiceSearchParametersHeavyForResource(FhirType.Value.GetLiteral());
                //DtoServiceSearchParameterHeavyForResourceList.AddRange(ICommonServices.GetServiceSearchParametersHeavyForResource(FHIRAllTypes.Resource.GetLiteral()));
                ResourceComponent.SearchParam = new List <CapabilityStatement.SearchParamComponent>();
                List <string> IncludesList    = null;
                List <string> RevIncludesList = null;
                foreach (var SupportedSearchParam in DtoServiceSearchParameterHeavyForResourceList)
                {
                    if (SupportedSearchParam.IsIndexed && SupportedSearchParam.Status == PublicationStatus.Active)
                    {
                        //Include (RevIncludes are below)
                        if (SupportedSearchParam.Type == SearchParamType.Reference)
                        {
                            if (IncludesList == null)
                            {
                                IncludesList = new List <string>();
                            }
                            if (SupportedSearchParam.TargetResourceTypeList.Count > 1)
                            {
                                foreach (var Target in SupportedSearchParam.TargetResourceTypeList)
                                {
                                    IncludesList.Add($"{SupportedSearchParam.Resource}:{SupportedSearchParam.Name}:{Target.ResourceType.GetLiteral()}");
                                }
                            }
                            else
                            {
                                IncludesList.Add($"{SupportedSearchParam.Resource}:{SupportedSearchParam.Name}");
                            }
                        }

                        CapabilityStatement.SearchParamComponent SearchParamComponent = new CapabilityStatement.SearchParamComponent();
                        ResourceComponent.SearchParam.Add(SearchParamComponent);

                        SearchParamComponent.Name       = SupportedSearchParam.Name;
                        SearchParamComponent.Type       = SupportedSearchParam.Type;
                        SearchParamComponent.Definition = SupportedSearchParam.Url;
                        if (!string.IsNullOrWhiteSpace(SupportedSearchParam.Description))
                        {
                            SearchParamComponent.Documentation = SupportedSearchParam.Description;
                        }
                    }
                }
                ResourceComponent.SearchInclude = IncludesList;

                //RevIncludes
                var RevIncludeSearchParameterList = DtoServiceSearchParameterHeavyList.Where(x => x.Type == SearchParamType.Reference && x.TargetResourceTypeList.Any(c => c.ResourceType == ResourceType));
                foreach (var Rev in RevIncludeSearchParameterList)
                {
                    if (RevIncludesList == null)
                    {
                        RevIncludesList = new List <string>();
                    }
                    if (Rev.TargetResourceTypeList.Count > 1)
                    {
                        RevIncludesList.Add($"{Rev.Resource}:{Rev.Name}:{CurrentResourceString}");
                    }
                    else
                    {
                        RevIncludesList.Add($"{Rev.Resource}:{Rev.Name}");
                    }
                }

                ResourceComponent.SearchRevInclude = RevIncludesList;
            }
            ConstructConformanceResourceNarrative(Conformance);

            IDatabaseOperationOutcome DatabaseOperationOutcome = IDatabaseOperationOutcomeFactory.CreateDatabaseOperationOutcome();

            ServiceOperationOutcome.FhirResourceId        = Conformance.Id;
            ServiceOperationOutcome.ResourceVersionNumber = Conformance.Version;
            ServiceOperationOutcome.LastModified          = Conformance.Meta.LastUpdated;
            ServiceOperationOutcome.OperationType         = Common.Enum.RestEnum.CrudOperationType.Read;
            ServiceOperationOutcome.IsDeleted             = false;
            ServiceOperationOutcome.RequestUri            = null;
            ServiceOperationOutcome.ResourceResult        = Conformance;
            ServiceOperationOutcome.FormatMimeType        = SearchParametersServiceOutcome.SearchParameters.Format;
            ServiceOperationOutcome.HttpStatusCode        = System.Net.HttpStatusCode.OK;
            return(ServiceOperationOutcome);
        }
示例#27
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);
            }
        }
示例#28
0
 public ApplicationMetaMiddleware(RequestDelegate next, IRequestMeta requestMeta)
 {
     _next        = next;
     _requestMeta = requestMeta;
 }
示例#29
0
 public DocumentBuilder(IJsonApiContext jsonApiContext, IRequestMeta requestMeta)
 {
     _jsonApiContext = jsonApiContext;
     _contextGraph   = jsonApiContext.ContextGraph;
     _requestMeta    = requestMeta;
 }
示例#30
0
        public IResourceServiceOutcome Process(string OperationName, Resource Resource, IRequestMeta RequestMeta)
        {
            if (string.IsNullOrWhiteSpace(OperationName))
            {
                throw new NullReferenceException("OperationName cannot be null.");
            }
            if (Resource == null)
            {
                throw new NullReferenceException("Resource cannot be null.");
            }
            if (RequestMeta == null)
            {
                throw new NullReferenceException("RequestMeta cannot be null.");
            }
            if (RequestMeta.PyroRequestUri == null)
            {
                throw new NullReferenceException("RequestUri cannot be null.");
            }
            if (RequestMeta.RequestHeader == null)
            {
                throw new NullReferenceException("RequestHeaders cannot be null.");
            }
            if (ICommonFactory == null)
            {
                throw new NullReferenceException("ICommonFactory cannot be null.");
            }
            if (RequestMeta.SearchParameterGeneric == null)
            {
                throw new NullReferenceException("SearchParameterGeneric cannot be null.");
            }

            IResourceServiceOutcome ResourceServiceOutcome = IResourceServiceOutcomeFactory.CreateResourceServiceOutcome();

            ISearchParameterService         SearchService = ISearchParameterServiceFactory.CreateSearchParameterService();
            ISearchParametersServiceOutcome SearchParametersServiceOutcome = SearchService.ProcessBaseSearchParameters(RequestMeta.SearchParameterGeneric);

            if (SearchParametersServiceOutcome.FhirOperationOutcome != null)
            {
                ResourceServiceOutcome.ResourceResult = SearchParametersServiceOutcome.FhirOperationOutcome;
                ResourceServiceOutcome.HttpStatusCode = SearchParametersServiceOutcome.HttpStatusCode;
                ResourceServiceOutcome.FormatMimeType = SearchParametersServiceOutcome.SearchParameters.Format;
                return(ResourceServiceOutcome);
            }

            var OperationDic = FhirOperationEnum.GetOperationTypeByString();

            if (!OperationDic.ContainsKey(Pyro.Common.Tools.StringSupport.ToLowerFast(OperationName)))
            {
                string Message = $"The resource operation named ${OperationName} is not supported by the server.";
                ResourceServiceOutcome.ResourceResult        = Common.Tools.FhirOperationOutcomeSupport.Create(Hl7.Fhir.Model.OperationOutcome.IssueSeverity.Error, Hl7.Fhir.Model.OperationOutcome.IssueType.NotSupported, Message);
                ResourceServiceOutcome.FormatMimeType        = SearchParametersServiceOutcome.SearchParameters.Format;
                ResourceServiceOutcome.HttpStatusCode        = System.Net.HttpStatusCode.BadRequest;
                ResourceServiceOutcome.SuccessfulTransaction = false;
                return(ResourceServiceOutcome);
            }

            var            Op             = OperationDic[Pyro.Common.Tools.StringSupport.ToLowerFast(OperationName)];
            OperationClass OperationClass = OperationClassFactory.OperationClassList.SingleOrDefault(x => x.Scope == FhirOperationEnum.OperationScope.Resource && x.Type == Op);

            if (OperationClass == null)
            {
                string Message = $"The resource operation named ${OperationName} is not supported by the server as a resource service operation type.";
                ResourceServiceOutcome.ResourceResult        = Common.Tools.FhirOperationOutcomeSupport.Create(Hl7.Fhir.Model.OperationOutcome.IssueSeverity.Error, Hl7.Fhir.Model.OperationOutcome.IssueType.NotSupported, Message);
                ResourceServiceOutcome.FormatMimeType        = SearchParametersServiceOutcome.SearchParameters.Format;
                ResourceServiceOutcome.HttpStatusCode        = System.Net.HttpStatusCode.BadRequest;
                ResourceServiceOutcome.SuccessfulTransaction = false;
                return(ResourceServiceOutcome);
            }

            switch (OperationClass.Type)
            {
            case FhirOperationEnum.OperationType.Validate:
            {
                IFhirValidateOperation FhirValidateOperation = ICommonFactory.CreateFhirValidateOperation();
                return(FhirValidateOperation.ValidateResource(OperationClass, Resource, RequestMeta));
            }

            case FhirOperationEnum.OperationType.xIHISearchOrValidate:
            {
                IIHISearchOrValidateOperation IHISearchOrValidateOperation = ICommonFactory.CreateIHISearchOrValidateOperation();
                return(IHISearchOrValidateOperation.IHISearchOrValidate(OperationClass, Resource, RequestMeta));
            }

            default:
                throw new System.ComponentModel.InvalidEnumArgumentException(OperationClass.Type.GetPyroLiteral(), (int)OperationClass.Type, typeof(FhirOperationEnum.OperationType));
            }
        }