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