示例#1
0
        public async Task <IActionResult> PatchFhir(string typeParameter, string idParameter, [FromBody] Parameters paramsResource, [ModelBinder(typeof(WeakETagBinder))] WeakETag ifMatchHeader)
        {
            var payload = new FhirPathPatchPayload(paramsResource);
            UpsertResourceResponse response = await _mediator.PatchResourceAsync(new ResourceKey(typeParameter, idParameter), payload, ifMatchHeader, HttpContext.RequestAborted);

            return(ToSaveOutcomeResult(response.Outcome));
        }
        public async Task GivenAResourceWithCorrectId_WhenUpsertingConditionallyWithOneMatch_ThenTheServerShouldReturnTheUpdatedResourceSuccessfully()
        {
            string id      = Guid.NewGuid().ToString();
            string version = Guid.NewGuid().ToString();

            var mockResultEntry = new SearchResultEntry(CreateMockResourceWrapper(Samples.GetDefaultObservation().UpdateId(id), false));

            mockResultEntry.Resource.Version.Returns(version);

            ConditionalUpsertResourceRequest message = SetupConditionalUpdate(
                SaveOutcomeType.Updated,
                Samples.GetDefaultObservation().UpdateId(id),
                mockResultEntry);

            UpsertResourceResponse result = await _mediator.Send <UpsertResourceResponse>(message);

            Assert.Equal(SaveOutcomeType.Updated, result.Outcome.Outcome);

            await _fhirDataStore.Received().UpsertAsync(
                Arg.Is <ResourceWrapper>(x => x.ResourceId == id),
                Arg.Is <WeakETag>(x => x.VersionId == version),
                true,
                true,
                Arg.Any <CancellationToken>());
        }
        public async Task GivenAResource_WhenCreatingConditionallyWithOneMatch_ThenTheServerShouldReturnTheResourceSuccessfully()
        {
            string id      = Guid.NewGuid().ToString();
            string version = Guid.NewGuid().ToString();

            var mockResultEntry = new SearchResultEntry(CreateMockResourceWrapper(Samples.GetDefaultObservation().UpdateId(id), false));

            mockResultEntry.Resource.Version.Returns(version);

            ConditionalCreateResourceRequest message = SetupConditionalCreate(
                Samples.GetDefaultObservation(),
                DefaultSearchParams,
                mockResultEntry);

            UpsertResourceResponse result = await _mediator.Send <UpsertResourceResponse>(message);

            Assert.Null(result);

            await _fhirDataStore.DidNotReceive().UpsertAsync(
                Arg.Any <ResourceWrapper>(),
                Arg.Any <WeakETag>(),
                true,
                true,
                Arg.Any <CancellationToken>());
        }
        public async Task <IActionResult> Create([FromBody] Resource resource)
        {
            StringValues conditionalCreateHeader = HttpContext.Request.Headers[KnownFhirHeaders.IfNoneExist];

            ResourceElement response;

            if (!string.IsNullOrEmpty(conditionalCreateHeader))
            {
                Tuple <string, string>[] conditionalParameters = QueryHelpers.ParseQuery(conditionalCreateHeader)
                                                                 .SelectMany(query => query.Value, (query, value) => Tuple.Create(query.Key, value)).ToArray();

                UpsertResourceResponse createResponse = await _mediator.Send <UpsertResourceResponse>(new ConditionalCreateResourceRequest(resource.ToResourceElement(), conditionalParameters), HttpContext.RequestAborted);

                if (createResponse == null)
                {
                    return(Ok());
                }

                response = createResponse.Outcome.Resource;
            }
            else
            {
                response = await _mediator.CreateResourceAsync(resource.ToResourceElement(), HttpContext.RequestAborted);
            }

            return(FhirResult.Create(response, HttpStatusCode.Created)
                   .SetETagHeader()
                   .SetLastModifiedHeader()
                   .SetLocationHeader(_urlResolver));
        }
示例#5
0
        public static async Task <SaveOutcome> UpsertResourceAsync(this IMediator mediator, Resource resource, WeakETag weakETag = null, CancellationToken cancellationToken = default)
        {
            EnsureArg.IsNotNull(mediator, nameof(mediator));
            EnsureArg.IsNotNull(resource, nameof(resource));

            UpsertResourceResponse result = await mediator.Send <UpsertResourceResponse>(new UpsertResourceRequest(resource, weakETag), cancellationToken);

            return(result.Outcome);
        }
示例#6
0
        public static async Task <Resource> CreateResourceAsync(this IMediator mediator, Resource resource, CancellationToken cancellationToken = default)
        {
            EnsureArg.IsNotNull(mediator, nameof(mediator));
            EnsureArg.IsNotNull(resource, nameof(resource));

            UpsertResourceResponse result = await mediator.Send <UpsertResourceResponse>(new CreateResourceRequest(resource), cancellationToken);

            return(result.Outcome.Resource);
        }
示例#7
0
        public async Task <IActionResult> ConditionalPatchFhir(string typeParameter, [FromBody] Parameters paramsResource, [ModelBinder(typeof(WeakETagBinder))] WeakETag ifMatchHeader)
        {
            IReadOnlyList <Tuple <string, string> > conditionalParameters = GetQueriesForSearch();
            var payload = new FhirPathPatchPayload(paramsResource);

            UpsertResourceResponse response = await _mediator.ConditionalPatchResourceAsync(typeParameter, payload, conditionalParameters, ifMatchHeader, HttpContext.RequestAborted);

            return(ToSaveOutcomeResult(response.Outcome));
        }
        public static async Task <UpsertResourceResponse> PatchResourceAsync(this IMediator mediator, ResourceKey key, JsonPatchDocument patchDocument, WeakETag weakETag = null, CancellationToken cancellationToken = default)
        {
            EnsureArg.IsNotNull(mediator, nameof(mediator));
            EnsureArg.IsNotNull(key, nameof(key));

            UpsertResourceResponse result = await mediator.Send(new PatchResourceRequest(key, patchDocument, weakETag), cancellationToken);

            return(result);
        }
示例#9
0
        public async Task GivenAResource_WhenCreatingConditionallyWithNoExisting_ThenTheServerShouldReturnTheResourceSuccessfully()
        {
            ConditionalCreateResourceRequest message = SetupConditionalCreate(Samples.GetDefaultObservation());

            UpsertResourceResponse result = await _mediator.Send <UpsertResourceResponse>(message);

            Assert.Equal(SaveOutcomeType.Created, result.Outcome.Outcome);

            await _fhirDataStore.Received().UpsertAsync(Arg.Is <ResourceWrapper>(x => x.ResourceId == result.Outcome.Resource.Id), null, true, true, Arg.Any <CancellationToken>());
        }
        public async Task GivenAResource_WhenUpsertingConditionallyWithNoIdAndNoExisting_ThenTheServerShouldReturnTheUpdatedResourceSuccessfully()
        {
            ConditionalUpsertResourceRequest message = SetupConditionalUpdate(SaveOutcomeType.Created, Samples.GetDefaultObservation());

            UpsertResourceResponse result = await _mediator.Send <UpsertResourceResponse>(message);

            Assert.Equal(SaveOutcomeType.Created, result.Outcome.Outcome);
            var deserialized = result.Outcome.RawResourceElement.ToPoco <Observation>(Deserializers.ResourceDeserializer).ToResourceElement();
            await _fhirDataStore.Received().UpsertAsync(Arg.Is <ResourceWrapper>(x => x.ResourceId == deserialized.Id), null, true, true, Arg.Any <CancellationToken>());
        }
示例#11
0
        public static async Task <UpsertResourceResponse> ConditionalPatchResourceAsync(this IMediator mediator, string typeParameter, PatchPayload payload, IReadOnlyList <Tuple <string, string> > conditionalParameters, WeakETag weakETag = null, CancellationToken cancellationToken = default)
        {
            EnsureArg.IsNotNull(mediator, nameof(mediator));
            EnsureArg.IsNotNull(typeParameter, nameof(typeParameter));
            EnsureArg.IsNotNull(payload, nameof(payload));
            EnsureArg.IsNotNull(conditionalParameters, nameof(conditionalParameters));

            UpsertResourceResponse result = await mediator.Send(new ConditionalPatchResourceRequest(typeParameter, payload, conditionalParameters, weakETag), cancellationToken);

            return(result);
        }
示例#12
0
        public async Task <IActionResult> ConditionalUpdate([FromBody] Resource resource)
        {
            IReadOnlyList <Tuple <string, string> > conditionalParameters = GetQueriesForSearch();

            UpsertResourceResponse response = await _mediator.Send <UpsertResourceResponse>(
                new ConditionalUpsertResourceRequest(resource.ToResourceElement(), conditionalParameters),
                HttpContext.RequestAborted);

            SaveOutcome saveOutcome = response.Outcome;

            return(ToSaveOutcomeResult(saveOutcome));
        }
示例#13
0
        public async Task <IActionResult> ConditionalPatch(string typeParameter, [FromBody] JsonPatchDocument patchDocument, [ModelBinder(typeof(WeakETagBinder))] WeakETag ifMatchHeader)
        {
            IReadOnlyList <Tuple <string, string> > conditionalParameters = GetQueriesForSearch();

            UpsertResourceResponse response = await _mediator.Send <UpsertResourceResponse>(
                new ConditionalPatchResourceRequest(typeParameter, patchDocument, conditionalParameters, ifMatchHeader),
                HttpContext.RequestAborted);

            SaveOutcome saveOutcome = response.Outcome;

            return(ToSaveOutcomeResult(saveOutcome));
        }
示例#14
0
        public async Task GivenACreateResourceRequest_WhenCreatingAResourceOtherThanSearchParameter_ThenNoCallToAddParameterMade()
        {
            var resource = Samples.GetDefaultObservation().UpdateId("id1");

            var request = new CreateResourceRequest(resource);
            var wrapper = CreateResourceWrapper(resource, false);

            var response = new UpsertResourceResponse(new SaveOutcome(new RawResourceElement(wrapper), SaveOutcomeType.Created));

            var behavior = new CreateOrUpdateSearchParameterBehavior <CreateResourceRequest, UpsertResourceResponse>(_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().AddSearchParameterAsync(Arg.Any <ITypedElement>());
        }
示例#15
0
        public async Task GivenACreateResourceRequest_WhenCreatingASearchParameterResource_ThenAddNewSearchParameterShouldBeCalled()
        {
            var searchParameter = new SearchParameter()
            {
                Id = "Id"
            };
            var resource = searchParameter.ToTypedElement().ToResourceElement();

            var request = new CreateResourceRequest(resource);
            var wrapper = CreateResourceWrapper(resource, false);

            var response = new UpsertResourceResponse(new SaveOutcome(new RawResourceElement(wrapper), SaveOutcomeType.Created));

            var behavior = new CreateOrUpdateSearchParameterBehavior <CreateResourceRequest, UpsertResourceResponse>(_searchParameterOperations, _fhirDataStore);
            await behavior.Handle(request, CancellationToken.None, async() => await Task.Run(() => response));

            await _searchParameterOperations.Received().AddSearchParameterAsync(Arg.Any <ITypedElement>());
        }
示例#16
0
        public async Task <IActionResult> Patch(string typeParameter, string idParameter, [FromBody] JsonPatchDocument patchDocument, [ModelBinder(typeof(WeakETagBinder))] WeakETag ifMatchHeader)
        {
            UpsertResourceResponse response = await _mediator.PatchResourceAsync(new ResourceKey(typeParameter, idParameter), patchDocument, ifMatchHeader, HttpContext.RequestAborted);

            return(ToSaveOutcomeResult(response.Outcome));
        }