Beispiel #1
0
        public async Task <IActionResult> Update([FromBody] Resource resource)
        {
            var suppliedWeakETag = HttpContext.Request.Headers[HeaderNames.IfMatch];

            WeakETag weakETag = null;

            if (!string.IsNullOrWhiteSpace(suppliedWeakETag))
            {
                weakETag = WeakETag.FromWeakETag(suppliedWeakETag);
            }

            SaveOutcome response = await _mediator.UpsertResourceAsync(resource.ToResourceElement(), weakETag, HttpContext.RequestAborted);

            switch (response.Outcome)
            {
            case SaveOutcomeType.Created:
                return(FhirResult.Create(response.Resource, HttpStatusCode.Created)
                       .SetETagHeader()
                       .SetLastModifiedHeader()
                       .SetLocationHeader(_urlResolver));

            case SaveOutcomeType.Updated:
                return(FhirResult.Create(response.Resource, HttpStatusCode.OK)
                       .SetETagHeader()
                       .SetLastModifiedHeader());
            }

            return(FhirResult.Create(response.Resource, HttpStatusCode.BadRequest));
        }
Beispiel #2
0
        public async Task GivenAResource_WhenDeleting_ThenServerShouldDeleteSuccessfully()
        {
            FhirResponse <Observation> response = await Client.CreateAsync(Samples.GetDefaultObservation());

            string resourceId = response.Resource.Id;
            string versionId  = response.Resource.Meta.VersionId;

            // Delete the resource.
            await Client.DeleteAsync(response.Resource);

            // Subsequent read on the resource should return Gone.
            FhirException ex = await ExecuteAndValidateGoneStatus(() => Client.ReadAsync <Observation>(ResourceType.Observation, resourceId));

            string eTag = ex.Headers.ETag.ToString();

            Assert.NotNull(eTag);

            string deleteVersionId = WeakETag.FromWeakETag(eTag).VersionId;

            // Subsequent read on the specific version should still work.
            await Client.VReadAsync <Observation>(ResourceType.Observation, resourceId, versionId);

            // Subsequent read on the deleted version should return Gone.
            await ExecuteAndValidateGoneStatus(() => Client.VReadAsync <Observation>(ResourceType.Observation, resourceId, deleteVersionId));

            async Task <FhirException> ExecuteAndValidateGoneStatus(Func <Task> action)
            {
                FhirException exception = await Assert.ThrowsAsync <FhirException>(action);

                Assert.Equal(HttpStatusCode.Gone, exception.StatusCode);

                return(exception);
            }
        }
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            EnsureArg.IsNotNull(bindingContext, nameof(bindingContext));

            var suppliedWeakETag = bindingContext.HttpContext.Request.Headers[HeaderNames.IfMatch];

            WeakETag model = null;

            if (!string.IsNullOrWhiteSpace(suppliedWeakETag))
            {
                try
                {
                    model = WeakETag.FromWeakETag(suppliedWeakETag);
                }
                catch (BadRequestException ex)
                {
                    bindingContext.ModelState.AddModelError(bindingContext.ModelName, ex.Message);
                    bindingContext.Result = ModelBindingResult.Failed();
                }
            }

            bindingContext.Model  = model;
            bindingContext.Result = ModelBindingResult.Success(model);

            return(Task.CompletedTask);
        }
Beispiel #4
0
        public async Task GivenADeletedIdAndVersionId_WhenGettingAResource_TheServerShouldReturnAGoneStatus()
        {
            Observation createdResource = await _client.CreateAsync(Samples.GetDefaultObservation().ToPoco <Observation>());

            using FhirResponse deleteResponse = await _client.DeleteAsync(createdResource);

            var deletedVersion = WeakETag.FromWeakETag(deleteResponse.Headers.ETag.ToString()).VersionId;

            using FhirException ex = await Assert.ThrowsAsync <FhirException>(
                      () => _client.VReadAsync <Observation>(ResourceType.Observation, createdResource.Id, deletedVersion));

            Assert.Equal(System.Net.HttpStatusCode.Gone, ex.StatusCode);
        }
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        EnsureArg.IsNotNull(bindingContext, nameof(bindingContext));

        var suppliedWeakETag = bindingContext.HttpContext.Request.Headers[HeaderNames.IfMatch];

        WeakETag model = null;

        if (!string.IsNullOrWhiteSpace(suppliedWeakETag))
        {
            model = WeakETag.FromWeakETag(suppliedWeakETag);
        }

        bindingContext.Model  = model;
        bindingContext.Result = ModelBindingResult.Success(model);

        return(Task.CompletedTask);
    }
        public void GivenAWeakETagString_WhenAddingETagDecoration_AWeakEtagShouldBeReturned()
        {
            var weakETag = WeakETag.FromWeakETag("W/\"version1\"");

            Assert.Equal("W/\"version1\"", weakETag.ToString());
        }
 public void GivenANonWeakETag_WhenUsingTheWrongMethodToCreate_ThenThrow()
 {
     Assert.Throws <BadRequestException>(() => WeakETag.FromWeakETag("\"version1\""));
 }
        public void GivenAWeakETag_WhenRemovingETagDecoration_ThenJustVersionShouldRemain()
        {
            var weakETag = WeakETag.FromWeakETag("W/\"version1\"");

            Assert.Equal("version1", weakETag.VersionId);
        }