/// <summary>
        /// Unmarshaller the response from the service to the response class.
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override AmazonWebServiceResponse Unmarshall(JsonUnmarshallerContext context)
        {
            DeleteResourceResponse response = new DeleteResourceResponse();


            return(response);
        }
        public async Task GivenMultipleMatchingResources_WhenDeletingConditionallyWithMultipleFlag_TheServerShouldDeleteSuccessfully()
        {
            var mockResultEntry1 = new SearchResultEntry(CreateMockResourceWrapper(Samples.GetDefaultObservation().UpdateId(Guid.NewGuid().ToString()), false));
            var mockResultEntry2 = new SearchResultEntry(CreateMockResourceWrapper(Samples.GetDefaultObservation().UpdateId(Guid.NewGuid().ToString()), false));

            ConditionalDeleteResourceRequest message = SetupConditionalDelete(
                KnownResourceTypes.Observation,
                DefaultSearchParams,
                hardDelete: false,
                count: 100,
                mockResultEntry1,
                mockResultEntry2);

            DeleteResourceResponse result = await _mediator.Send(message);

            Assert.NotNull(result);
            Assert.Equal(2, result.ResourcesDeleted);

            await _fhirDataStore.Received(2).UpsertAsync(
                Arg.Is <ResourceWrapper>(x => x.IsDeleted),
                Arg.Any <WeakETag>(),
                true,
                true,
                Arg.Any <CancellationToken>());
        }
        /// <summary>
        /// Unmarshaller the response from the service to the response class.
        /// </summary>  
        /// <param name="context"></param>
        /// <returns></returns>
        public override AmazonWebServiceResponse Unmarshall(JsonUnmarshallerContext context)
        {
            DeleteResourceResponse response = new DeleteResourceResponse();


            return response;
        }
        public async Task GivenNoExistingResources_WhenDeletingConditionally_TheServerShouldReturn()
        {
            ConditionalDeleteResourceRequest message = SetupConditionalDelete(KnownResourceTypes.Observation, DefaultSearchParams);

            DeleteResourceResponse result = await _mediator.Send(message);

            Assert.Equal(0, result.ResourcesDeleted);
        }
Example #5
0
        public async Task <IActionResult> ConditionalDelete(string typeParameter, [FromQuery] bool hardDelete, [FromQuery(Name = KnownQueryParameterNames.Count)] int?maxDeleteCount)
        {
            IReadOnlyList <Tuple <string, string> > conditionalParameters = GetQueriesForSearch();

            DeleteResourceResponse response = await _mediator.Send(new ConditionalDeleteResourceRequest(typeParameter, conditionalParameters, hardDelete ? DeleteOperation.HardDelete : DeleteOperation.SoftDelete, maxDeleteCount.GetValueOrDefault(1)), HttpContext.RequestAborted);

            if (maxDeleteCount.HasValue)
            {
                Response.Headers.Add(KnownHeaders.ItemsDeleted, (response?.ResourcesDeleted ?? 0).ToString(CultureInfo.InvariantCulture));
            }

            return(FhirResult.NoContent().SetETagHeader(response?.WeakETag));
        }
        public async Task GivenANonExistingResourceToDeleteRequest_WhenHandled_ThenTheResponseShouldHaveANullWeakETag(bool hardDelete)
        {
            var repository         = Substitute.For <IFhirRepository>();
            var handler            = new DeleteResourceHandler(repository);
            var resourceId         = Guid.NewGuid().ToString();
            var deletedResourceKey = new ResourceKey("Observation", resourceId);

            repository.DeleteAsync(Arg.Any <ResourceKey>(), hardDelete).Returns(deletedResourceKey);

            DeleteResourceResponse response = await handler.Handle(
                new DeleteResourceRequest("Observation", resourceId, hardDelete),
                CancellationToken.None);

            await repository.Received().DeleteAsync(Arg.Any <ResourceKey>(), hardDelete);

            Assert.Null(response.WeakETag);
        }
        public async Task GivenADeleteResourceRequest_WhenHandled_ThenTheResponseShouldHaveTheDeletedVersion()
        {
            var repository         = Substitute.For <IFhirRepository>();
            var handler            = new DeleteResourceHandler(repository);
            var resourceId         = Guid.NewGuid().ToString();
            var deletedResourceKey = new ResourceKey("Observation", resourceId, Guid.NewGuid().ToString());

            repository.DeleteAsync(Arg.Any <ResourceKey>(), false).Returns(deletedResourceKey);

            DeleteResourceResponse response = await handler.Handle(
                new DeleteResourceRequest("Observation", resourceId, false),
                CancellationToken.None);

            await repository.Received().DeleteAsync(Arg.Any <ResourceKey>(), false);

            Assert.Equal(deletedResourceKey.VersionId, response.WeakETag.VersionId);
        }
Example #8
0
        public async Task GivenADeleteResourceRequest_WhenDeletingAResourceOtherThanSearchParameter_ThenNoCallToDeleteParameterMade()
        {
            var resource = Samples.GetDefaultObservation().UpdateId("id1");

            var key     = new ResourceKey("Observation", "id1");
            var request = new DeleteResourceRequest(key, DeleteOperation.SoftDelete);
            var wrapper = CreateResourceWrapper(resource, false);

            _fhirDataStore.GetAsync(key, Arg.Any <CancellationToken>()).Returns(wrapper);

            var response = new DeleteResourceResponse(key);

            var behavior = new DeleteSearchParameterBehavior <DeleteResourceRequest, DeleteResourceResponse>(_searchParameterOperations, _fhirDataStore);
            await behavior.Handle(request, CancellationToken.None, async() => await Task.Run(() => response));

            // Ensure for non-SearchParameter, that we do not call Add SearchParameter
            await _searchParameterOperations.DidNotReceive().DeleteSearchParameterAsync(Arg.Any <RawResource>());
        }
Example #9
0
        /// <summary>
        /// Unmarshaller the response from the service to the response class.
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public override AmazonWebServiceResponse Unmarshall(JsonUnmarshallerContext context)
        {
            DeleteResourceResponse response = new DeleteResourceResponse();

            context.Read();
            int targetDepth = context.CurrentDepth;

            while (context.ReadAtDepth(targetDepth))
            {
                if (context.TestExpression("ProgressEvent", targetDepth))
                {
                    var unmarshaller = ProgressEventUnmarshaller.Instance;
                    response.ProgressEvent = unmarshaller.Unmarshall(context);
                    continue;
                }
            }

            return(response);
        }
Example #10
0
        public async Task <IActionResult> Delete(string typeParameter, string idParameter, [FromQuery] bool hardDelete)
        {
            string policy = PolicyNames.WritePolicy;

            if (hardDelete)
            {
                policy = PolicyNames.HardDeletePolicy;
            }

            AuthorizationResult authorizationResult = await _authorizationService.AuthorizeAsync(User, policy);

            if (!authorizationResult.Succeeded)
            {
                return(Forbid());
            }

            DeleteResourceResponse response = await _mediator.DeleteResourceAsync(new ResourceKey(typeParameter, idParameter), hardDelete, HttpContext.RequestAborted);

            return(FhirResult.NoContent().SetETagHeader(response.WeakETag));
        }
Example #11
0
        public async Task GivenOneMatchingResource_WhenDeletingConditionallyWithHardDeleteFlag_TheServerShouldDeleteSuccessfully()
        {
            var mockResultEntry = new SearchResultEntry(CreateMockResourceWrapper(Samples.GetDefaultObservation().UpdateId(Guid.NewGuid().ToString()), false));

            ConditionalDeleteResourceRequest message = SetupConditionalDelete(KnownResourceTypes.Observation, DefaultSearchParams, true, 1, mockResultEntry);

            DeleteResourceResponse result = await _mediator.Send(message);

            Assert.NotNull(result);
            Assert.Equal(1, result.ResourcesDeleted);

            await _fhirDataStore.DidNotReceive().UpsertAsync(
                Arg.Any <ResourceWrapper>(),
                Arg.Any <WeakETag>(),
                true,
                true,
                Arg.Any <CancellationToken>());

            await _fhirDataStore.Received().HardDeleteAsync(Arg.Any <ResourceKey>(), Arg.Any <bool>(), Arg.Any <CancellationToken>());
        }
Example #12
0
        public async Task GivenADeleteResourceRequest_WhenDeletingAnAlreadyDeletedSearchParameterResource_TheDeleteSearchParameterShouldNotBeCalled()
        {
            var searchParameter = new SearchParameter()
            {
                Id = "Id"
            };
            var resource = searchParameter.ToTypedElement().ToResourceElement();

            var key     = new ResourceKey("SearchParameter", "Id");
            var request = new DeleteResourceRequest(key, DeleteOperation.SoftDelete);
            var wrapper = CreateResourceWrapper(resource, true);

            _fhirDataStore.GetAsync(key, Arg.Any <CancellationToken>()).Returns(wrapper);

            var response = new DeleteResourceResponse(key);

            var behavior = new DeleteSearchParameterBehavior <DeleteResourceRequest, DeleteResourceResponse>(_searchParameterOperations, _fhirDataStore);
            await behavior.Handle(request, CancellationToken.None, async() => await Task.Run(() => response));

            await _searchParameterOperations.DidNotReceive().DeleteSearchParameterAsync(Arg.Any <RawResource>());
        }
Example #13
0
        public async Task <IActionResult> Delete(string typeParameter, string idParameter, [FromQuery] bool hardDelete)
        {
            DeleteResourceResponse response = await _mediator.DeleteResourceAsync(new ResourceKey(typeParameter, idParameter), hardDelete, HttpContext.RequestAborted);

            return(FhirResult.NoContent().SetETagHeader(response.WeakETag));
        }
Example #14
0
        public async Task <IActionResult> PurgeHistory(string typeParameter, string idParameter)
        {
            DeleteResourceResponse response = await _mediator.DeleteResourceAsync(new ResourceKey(typeParameter, idParameter), DeleteOperation.PurgeHistory, HttpContext.RequestAborted);

            return(FhirResult.NoContent().SetETagHeader(response.WeakETag));
        }