public async Task <Bundle> Find <T>(FhirRequest request, bool returnFirst) where T : Resource
        {
            ValidateResource(request.StrResourceType);

            try
            {
                var query = _fhirSearchHelper.BuildQuery(request);

                var resources = await _context.FindResource(request.StrResourceType, query).ToFhirListAsync <T>();

                var bundle = _fhirSearchHelper.ToBundle <T>(request, resources);

                if (returnFirst)
                {
                    var entries = bundle.Entry;
                    bundle.Entry = entries.Take(1).ToList();
                    bundle.Total = 1;
                }

                return(bundle);
            }
            catch (Exception ex)
            {
                throw new HttpFhirException($"FhirSearch.Find | {ex.Message}", OperationOutcomeFactory.CreateInternalError(ex.Message), HttpStatusCode.BadRequest);
            }
        }
        public async SystemTasks.Task <Resource> SupersedeWithoutValidation(FhirRequest request, string oldDocumentId, string oldVersionId)
        {
            UpdateDefinition <BsonDocument> updates = null;
            FhirRequest updateRequest = null;

            SetMetaValues(request);
            BuildSupersede(oldDocumentId, oldVersionId, out updates, out updateRequest);

            Resource created;
            bool     updated;

            try
            {
                (created, updated) = await _fhirMaintain.CreateWithUpdate <DocumentReference>(request, updateRequest, updates);
            }
            catch
            {
                throw new HttpFhirException("Error Updating DocumentReference", OperationOutcomeFactory.CreateInternalError($"There has been an internal error when attempting to persist the DocumentReference. Please contact the national helpdesk quoting - {Guid.NewGuid()}"));
            }

            var response = created;

            if (response == null)
            {
                response = OperationOutcomeFactory.CreateInvalidResource("Unknown");
            }

            if (!updated)
            {
                response = OperationOutcomeFactory.CreateInvalidResource("relatesTo");
            }

            return(response);
        }
        public async Task <Resource> Get <T>(FhirRequest request) where T : Resource
        {
            ValidateResource(request.StrResourceType);

            var filter = _fhirSearchHelper.BuildIdQuery(request.Id);

            try
            {
                //var options = new FindOptions<BsonDocument, BsonDocument>();
                //options.Sort = Builders<Personnel>.Sort.Ascending(x => x.Name);

                var resource = await _context.Resource(request.StrResourceType).FindSync <BsonDocument>(filter).FirstOrDefaultAsync();

                Resource document;

                var documents = new List <DocumentReference>();

                if (resource != null)
                {
                    document = await resource?.ToFhirAsync <T>();

                    documents.Add(document as DocumentReference);
                }

                //Get now returns bundle as per updated spec
                var bundle = ToBundle(request, documents);

                return(bundle);
            }
            catch (Exception ex)
            {
                // log or manage the exception
                throw ex;
            }
        }
        public async Task <Resource> Get(FhirRequest request)
        {
            ValidateResource(request.StrResourceType);

            request.ProfileUri = _resourceProfile;

            return(await _fhirSearch.Get <Organization>(request));
        }
Beispiel #5
0
        public void FhirRequest_ValidSubjectParam()
        {
            var expected = "https://demographics.spineservices.nhs.uk/STU3/Patient/2686033207";

            var request = FhirRequest.Create(null, ResourceType.DocumentReference, null, HttpContexts.Valid_ConditionalDelete.Request, "000");

            Assert.Equal(expected, request.SubjectParameter);
        }
Beispiel #6
0
        public async Task <Resource> Get <T>(FhirRequest request) where T : Resource
        {
            ValidateResource(request.StrResourceType);

            request.ProfileUri = _resourceProfile;

            return(await _fhirSearch.Get <T>(request));
        }
Beispiel #7
0
        public void FhirRequest_ValidId()
        {
            var expectedId = "testId";

            var request = FhirRequest.Create("testId", ResourceType.DocumentReference, NrlsPointers.Valid, HttpContexts.Valid_Delete_Pointer.Request, "000");

            Assert.Equal(expectedId, request.Id);
        }
        public async Task <IActionResult> Search()
        {
            var request = FhirRequest.Create(null, ResourceType.DocumentReference, null, Request, RequestingAsid());

            var result = await _nrlsSearch.Find(request);

            return(Ok(result));
        }
Beispiel #9
0
        public async Task <Resource> Search()
        {
            var request = FhirRequest.Create(null, ResourceType.Patient, null, Request, null);

            var result = await _pdsSearch.Find <Patient>(request);

            return(result);
        }
Beispiel #10
0
        public async Task <IActionResult> Search()
        {
            var request = FhirRequest.Create(null, ResourceType.Patient, null, Request, null);

            var result = await _pdsSearch.Find(request);

            return(Ok(result));
        }
Beispiel #11
0
        public async Task <Resource> Read(string id)
        {
            var request = FhirRequest.Create(id, ResourceType.Patient, null, Request, null);

            var result = await _pdsSearch.Get <Patient>(request);

            return(result);
        }
Beispiel #12
0
        public void FhirRequest_ValidIdentifierParam()
        {
            var expected = "testSystem|testValue";

            var request = FhirRequest.Create(null, ResourceType.DocumentReference, null, HttpContexts.Valid_ConditionalDelete.Request, "000");

            Assert.Equal(expected, request.IdentifierParameter);
        }
        public async Task <Resource> Read(string id)
        {
            var request = FhirRequest.Create(id, ResourceType.Organization, null, Request, null);

            var result = await _odsSearch.Find <Organization>(request);

            return(result);
        }
        public Task <Bundle> Find(FhirRequest request)
        {
            ValidateResource(request.StrResourceType);

            request.ProfileUri = _resourceProfile;


            return(_fhirSearch.Find <Organization>(request));
        }
        public async Task <T> Get <T>(FhirRequest request) where T : Resource
        {
            //Force BuildQuery to return simple id filter
            request.IsIdQuery = true;

            var documents = await Find <T>(request, true);

            return(documents.Entry.FirstOrDefault()?.Resource as T);
        }
Beispiel #16
0
        public async Task <Bundle> Find(FhirRequest request)
        {
            ValidateResource(request.StrResourceType);

            request.ProfileUri = _resourceProfile;


            return(await _fhirSearch.Find <Patient>(request));
        }
        public async Task <Bundle> GetByMasterId <T>(FhirRequest request) where T : Resource
        {
            //Add identifier on the fly as it is not a standard search parameter
            request.AllowedParameters = request.AllowedParameters.Concat(new[] { "identifier" }).ToArray();

            var bundle = await Find <T>(request, true);

            return(bundle);
        }
        /// <summary>
        /// Get a DocumentReference by id
        /// </summary>
        /// <remarks>
        /// Get a single DocumentReference using the DocRef logical id
        /// </remarks>
        public async Task <Resource> Get(FhirRequest request)
        {
            ValidateResource(request.StrResourceType);

            request.ProfileUri = _resourceProfile;

            var result = await _fhirSearch.Get <DocumentReference>(request);

            return(result);
        }
Beispiel #19
0
        public void BuildSupersede_InvalidVersion()
        {
            var service = new NrlsMaintain(_nrlsApiSettings, _fhirMaintain, _fhirSearch, _cache, _fhirValidation);

            Assert.Throws <HttpFhirException>(delegate
            {
                UpdateDefinition <BsonDocument> updates = null;
                FhirRequest updateRequest = null;

                service.BuildSupersede("1", "bad-number", out updates, out updateRequest);
            });
        }
        public static FhirRequest CreateReferenceSearch(FhirRequest request, string logicalId)
        {
            if (!string.IsNullOrWhiteSpace(logicalId))
            {
                request.Id = logicalId;

                var searchRequest = FhirRequest.Copy(request, ResourceType.DocumentReference, null, null, request.ProfileUri);
                return(searchRequest);
            }

            return(null);
        }
Beispiel #21
0
        public async SystemTasks.Task <Resource> ValidateConditionalUpdate(FhirRequest request)
        {
            if (!request.Resource.ResourceType.Equals(ResourceType.DocumentReference))
            {
                return(OperationOutcomeFactory.CreateInvalidResource("relatesTo"));
            }

            var document = request.Resource as DocumentReference;

            if (document.RelatesTo == null || document.RelatesTo.Count == 0)
            {
                return(null);
            }

            var relatesTo = _fhirValidation.GetValidRelatesTo(document.RelatesTo);

            if (relatesTo.element == null)
            {
                return(OperationOutcomeFactory.CreateInvalidResource(relatesTo.issue));
            }

            //Subject already validated during ValidateCreate
            //relatesTo Identifier already validated during ValidateCreate => validPointer
            var subjectNhsNumber = _fhirValidation.GetSubjectReferenceId(document.Subject);
            var pointerRequest   = NrlsPointerHelper.CreateMasterIdentifierSearch(request, relatesTo.element.Target.Identifier, subjectNhsNumber);
            var pointers         = await _fhirSearch.Find <DocumentReference>(pointerRequest) as Bundle;

            if (pointers.Entry.Count != 1)
            {
                //Cant find related document
                return(OperationOutcomeFactory.CreateInvalidResource("relatesTo.target"));
            }

            //Custodian already validated against incoming ASID during ValidateCreate
            var custodianOdsCode = _fhirValidation.GetOrganizationReferenceId(document.Custodian);

            var oldDocument = pointers.Entry.First().Resource as DocumentReference;

            if (oldDocument.Custodian == null || string.IsNullOrEmpty(oldDocument.Custodian.Reference) || oldDocument.Custodian.Reference != $"{FhirConstants.SystemODS}{custodianOdsCode}")
            {
                //related document does not have same custodian
                return(OperationOutcomeFactory.CreateInvalidResource("relatesTo.target"));
            }

            if (oldDocument.Status != DocumentReferenceStatus.Current)
            {
                //Only allowed to transition to superseded from current
                return(OperationOutcomeFactory.CreateInvalidResource("relatesTo.code"));
            }

            return(oldDocument);
        }
Beispiel #22
0
        public async Task <IActionResult> Search()
        {
            var request = FhirRequest.Create(null, ResourceType.DocumentReference, null, Request, RequestingAsid());

            var result = await _nrlsSearch.Find <DocumentReference>(request);

            if (result.ResourceType == ResourceType.OperationOutcome)
            {
                return(NotFound(result));
            }

            return(Ok(result));
        }
Beispiel #23
0
        public async Task <IActionResult> Read(string id)
        {
            var request = FhirRequest.Create(id, ResourceType.Patient, null, Request, null);

            var result = await _pdsSearch.Get(request);

            if (result == null)
            {
                return(NotFound(OperationOutcomeFactory.CreateNotFound(id)));
            }

            return(Ok(result));
        }
        public async SystemTasks.Task <Resource> CreateWithoutValidation(FhirRequest request)
        {
            SetMetaValues(request);

            var response = await _fhirMaintain.Create <DocumentReference>(request);

            if (response == null)
            {
                return(OperationOutcomeFactory.CreateInvalidResource("Unknown"));
            }

            return(response);
        }
Beispiel #25
0
        public async Task <IActionResult> Create([FromBody] Resource resource)
        {
            //TODO: Remove temp code
            if (resource.ResourceType.Equals(ResourceType.OperationOutcome))
            {
                throw new HttpFhirException("Invalid Fhir Request", (OperationOutcome)resource, HttpStatusCode.BadRequest);
            }

            Resource result = null;

            var request = FhirRequest.Create(null, ResourceType.DocumentReference, resource, Request, RequestingAsid());

            var createIssue = await _nrlsMaintain.ValidateCreate <DocumentReference>(request);

            if (createIssue != null)
            {
                return(BadRequest(createIssue));
            }

            //If we have a valid document that needs to be Superseded, try update on that
            var validUpdateDocument = await _nrlsMaintain.ValidateConditionalUpdate(request);

            if (validUpdateDocument != null)
            {
                if (validUpdateDocument.ResourceType == ResourceType.OperationOutcome)
                {
                    return(BadRequest(validUpdateDocument));
                }

                result = await _nrlsMaintain.SupersedeWithoutValidation <DocumentReference>(request, validUpdateDocument.Id, validUpdateDocument.VersionId);
            }
            else
            {
                //just try and create new document
                result = await _nrlsMaintain.CreateWithoutValidation <DocumentReference>(request);
            }

            if (result.ResourceType == ResourceType.OperationOutcome)
            {
                return(BadRequest(result));
            }

            var response = OperationOutcomeFactory.CreateSuccess();

            var newResource = $"{_nrlsApiSettings.ResourceLocation}/{ResourceType.DocumentReference}?_id={result.Id}";

            //Temp required header for NRLS API tests
            Request.HttpContext.Response.Headers.Add("Content-Location", newResource);

            return(Created(newResource, response));
        }
Beispiel #26
0
        public void BuildSupersede_Valid()
        {
            var service = new NrlsMaintain(_nrlsApiSettings, _fhirMaintain, _fhirSearch, _cache, _fhirValidation);

            UpdateDefinition <BsonDocument> updates = null;
            FhirRequest updateRequest = null;

            service.BuildSupersede("1", "2", out updates, out updateRequest);

            Assert.NotNull(updates);
            Assert.NotNull(updateRequest);

            Assert.Equal("1", updateRequest.Id);
        }
        public static FhirRequest CreateOrgSearch(FhirRequest request, string orgCode)
        {
            if (!string.IsNullOrWhiteSpace(orgCode))
            {
                var queryParameters = new List <Tuple <string, string> >
                {
                    new Tuple <string, string>("identifier", $"{FhirConstants.SystemOrgCode}|{orgCode}")
                };

                return(FhirRequest.Copy(request, ResourceType.Organization, null, queryParameters, request.ProfileUri));
            }

            return(null);
        }
Beispiel #28
0
        public async Task <IActionResult> Delete()
        {
            var request = FhirRequest.Create(null, ResourceType.DocumentReference, null, Request, RequestingAsid());

            var result = await _nrlsMaintain.Delete <DocumentReference>(request);

            if (result != null && result.Success)
            {
                //Assume success
                return(Ok(result));
            }

            return(NotFound(result));
        }
        public async Task <Organization> GetByQuery(FhirRequest request)
        {
            ValidateResource(request.StrResourceType);

            request.ProfileUri = _resourceProfile;


            var bundle = await _fhirSearch.GetAsBundle <Organization>(request);

            if (bundle == null || (bundle.Total != 1))
            {
                return(null);
            }

            return(bundle.Entry.FirstOrDefault()?.Resource as Organization);
        }
        public static FhirRequest CreatePatientSearch(FhirRequest request, string nhsNumber)
        {
            if (!string.IsNullOrWhiteSpace(nhsNumber))
            {
                var queryParameters = new List <Tuple <string, string> >
                {
                    new Tuple <string, string>("identifier", $"{FhirConstants.SystemNhsNumber}|{nhsNumber}")
                };

                var searchRequest = FhirRequest.Copy(request, ResourceType.Patient, null, queryParameters, FhirConstants.SystemPatientProfile);

                return(searchRequest);
            }

            return(null);
        }