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)); }
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); }
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); }