public void CreateDelete_Is_Valid()
        {
            var actual = OperationOutcomeFactory.CreateDelete("https://testdomain/testurl", "91370360-d667-4bc8-bebe-f223560ff90e");

            Assert.IsType <OperationOutcome>(actual);

            //Assert.NotNull(actual.Meta);
            //Assert.NotNull(actual.Meta.Profile);
            //Assert.NotEmpty(actual.Meta.Profile);
            //Assert.Contains("https://fhir.nhs.uk/STU3/StructureDefinition/Spine-OperationOutcome-1-0", actual.Meta.Profile);

            Assert.NotNull(actual.Issue);
            Assert.NotEmpty(actual.Issue);

            Assert.Equal("Successfully removed resource DocumentReference: https://testdomain/testurl", actual.Issue.First().Diagnostics);
            Assert.Equal(OperationOutcome.IssueType.Informational.ToString(), actual.Issue.First().Code.ToString());
            Assert.Equal(OperationOutcome.IssueSeverity.Information.ToString(), actual.Issue.First().Severity.ToString());

            Assert.NotNull(actual.Issue.First().Details);
            Assert.NotNull(actual.Issue.First().Details.Coding);
            Assert.NotEmpty(actual.Issue.First().Details.Coding);

            Assert.Equal("91370360-d667-4bc8-bebe-f223560ff90e", actual.Issue.First().Details.Text);

            Assert.Equal("RESOURCE_DELETED", actual.Issue.First().Details.Coding.First().Code);
            Assert.Equal("Resource removed", actual.Issue.First().Details.Coding.First().Display);
        }
        /// <summary>
        /// Delete a DocumentReference using the id in the path or the id value found in the request _id query parameter, or by Master Identifier
        /// </summary>
        /// <remarks>
        /// First we do a search to get the document, then we check the incoming ASID associated OrgCode against the custodian on the document.
        /// If valid we can delete.
        /// We use the FhirMaintain service and FhirSearch service to facilitate this
        /// </remarks>
        public async SystemTasks.Task <OperationOutcome> Delete(FhirRequest request)
        {
            ValidateResource(request.StrResourceType);

            request.ProfileUri = _resourceProfile;

            // NRLS Layers of validation before Fhir Delete Call
            //If we have id path segment we should have nothing else
            if (!string.IsNullOrEmpty(request.Id) && (!string.IsNullOrEmpty(request.IdParameter) || !string.IsNullOrEmpty(request.IdentifierParameter) || !string.IsNullOrEmpty(request.SubjectParameter)))
            {
                throw new HttpFhirException("Invalid query parameters for Delete by Logical Id", OperationOutcomeFactory.CreateInvalidParameter("Invalid query parameters for Delete by Logical Id"), HttpStatusCode.BadRequest);
            }

            //If we did not start from HTTP DELETE DocRef/[id] set id
            if (string.IsNullOrEmpty(request.Id))
            {
                request.Id = request.IdParameter;
            }

            var identifier = request.IdentifierParameter;
            var identifierValidationResult = _fhirValidation.ValidateIdentifierParameter("identifier", identifier);
            var subject = request.SubjectParameter;
            var subjectValidationResult = _fhirValidation.ValidatePatientParameter(subject);


            if (string.IsNullOrEmpty(request.Id) && identifierValidationResult != null && subjectValidationResult != null)
            {
                throw new HttpFhirException("Missing or Invalid _id parameter", OperationOutcomeFactory.CreateInvalidParameter("Invalid parameter: _id"), HttpStatusCode.BadRequest);
            }

            if (string.IsNullOrEmpty(request.Id) && identifierValidationResult == null && subjectValidationResult != null)
            {
                throw new HttpFhirException("Missing or Invalid subject parameter", OperationOutcomeFactory.CreateInvalidParameter("Invalid parameter: subject"), HttpStatusCode.BadRequest);
            }

            if (string.IsNullOrEmpty(request.Id) && identifierValidationResult != null && subjectValidationResult == null)
            {
                throw new HttpFhirException("Missing or Invalid identifier parameter", OperationOutcomeFactory.CreateInvalidParameter("Invalid parameter: identifier"), HttpStatusCode.BadRequest);
            }


            Resource document;

            if (!string.IsNullOrEmpty(request.Id))
            {
                ObjectId mongoId;

                if (!ObjectId.TryParse(request.Id, out mongoId))
                {
                    throw new HttpFhirException("Invalid _id parameter", OperationOutcomeFactory.CreateInvalidParameter("Invalid parameter", $"The Logical ID format does not apply to the given Logical ID - {request.Id}"), HttpStatusCode.BadRequest);
                }

                request.IsIdQuery = true;

                document = await _fhirSearch.GetAsBundle <DocumentReference>(request);
            }
            else
            {
                document = await _fhirSearch.GetByMasterId <DocumentReference>(request);
            }

            var documentResponse = ParseRead(document, request.Id);

            if (documentResponse.ResourceType == ResourceType.Bundle)
            {
                var result = documentResponse as Bundle;

                if (!result.Total.HasValue || result.Total.Value < 1 || result.Entry.FirstOrDefault() == null)
                {
                    return(OperationOutcomeFactory.CreateNotFound(request.Id));
                }

                var orgDocument = result.Entry.FirstOrDefault().Resource as DocumentReference;

                var orgCode = _fhirValidation.GetOrganizationReferenceId(orgDocument.Custodian);

                var invalidAsid = InvalidAsid(orgCode, request.RequestingAsid);

                if (invalidAsid != null)
                {
                    return(invalidAsid);
                }
            }
            else
            {
                return(documentResponse as OperationOutcome);
            }

            bool deleted;

            if (!string.IsNullOrEmpty(request.Id))
            {
                deleted = await _fhirMaintain.Delete <DocumentReference>(request);
            }
            else
            {
                //Add identifier on the fly as it is not a standard search parameter
                request.AllowedParameters = request.AllowedParameters.Concat(new[] { "identifier" }).ToArray();

                deleted = await _fhirMaintain.DeleteConditional <DocumentReference>(request);
            }

            if (!deleted)
            {
                return(OperationOutcomeFactory.CreateNotFound(request.Id));
            }

            return(OperationOutcomeFactory.CreateDelete(request.RequestUrl?.AbsoluteUri, request.AuditId));
        }