public ResourceElement CreateSearchBundle(SearchResult result) { EnsureArg.IsNotNull(result, nameof(result)); // Create the bundle from the result. var bundle = new Bundle(); if (result != null) { IEnumerable <Bundle.EntryComponent> entries = result.Results.Select(r => { ResourceElement resource = _deserializer.Deserialize(r); return(new Bundle.EntryComponent { FullUrlElement = new FhirUri(_urlResolver.ResolveResourceUrl(resource)), Resource = resource.Instance.ToPoco <Resource>(), Search = new Bundle.SearchComponent { // TODO: For now, everything returned is a match. We will need to // distinct between match and include once we support it. Mode = Bundle.SearchEntryMode.Match, }, }); }); bundle.Entry.AddRange(entries); if (result.ContinuationToken != null) { bundle.NextLink = _urlResolver.ResolveRouteUrl( result.UnsupportedSearchParameters, result.ContinuationToken); } } // Add the self link to indicate which search parameters were used. bundle.SelfLink = _urlResolver.ResolveRouteUrl(result.UnsupportedSearchParameters); bundle.Id = _fhirRequestContextAccessor.FhirRequestContext.CorrelationId; bundle.Type = Bundle.BundleType.Searchset; bundle.Total = result?.TotalCount; bundle.Meta = new Meta { LastUpdated = Clock.UtcNow, }; return(bundle.ToResourceElement()); }
public ResourceElement CreateSearchBundle(SearchResult result) { return(CreateBundle(result, Bundle.BundleType.Searchset, r => { ResourceElement resource = _deserializer.Deserialize(r.Resource); return new Bundle.EntryComponent { FullUrlElement = new FhirUri(_urlResolver.ResolveResourceUrl(resource)), Resource = resource.Instance.ToPoco <Resource>(), Search = new Bundle.SearchComponent { Mode = r.SearchEntryMode == SearchEntryMode.Match ? Bundle.SearchEntryMode.Match : Bundle.SearchEntryMode.Include, }, }; })); }
public ResourceElement CreateSearchBundle(SearchResult result) { return(CreateBundle(result, Bundle.BundleType.Searchset, r => { ResourceElement resource = _deserializer.Deserialize(r); return new Bundle.EntryComponent { FullUrlElement = new FhirUri(_urlResolver.ResolveResourceUrl(resource)), Resource = resource.Instance.ToPoco <Resource>(), Search = new Bundle.SearchComponent { // TODO: For now, everything returned is a match. We will need to // distinct between match and include once we support it. Mode = Bundle.SearchEntryMode.Match, }, }; })); }
public void GivenASearchResult_WhenCreateSearchBundle_ThenCorrectBundleShouldBeReturned() { _urlResolver.ResolveResourceUrl(Arg.Any <ResourceElement>()).Returns(x => new Uri(string.Format(_resourceUrlFormat, x.ArgAt <ResourceElement>(0).Id))); _urlResolver.ResolveRouteUrl(_unsupportedSearchParameters).Returns(_selfUrl); ResourceElement observation1 = Samples.GetDefaultObservation().UpdateId("123"); ResourceElement observation2 = Samples.GetDefaultObservation().UpdateId("abc"); var resourceWrappers = new ResourceWrapper[] { CreateResourceWrapper(observation1), CreateResourceWrapper(observation2), }; var searchResult = new SearchResult(resourceWrappers, _unsupportedSearchParameters, continuationToken: null); ResourceElement actual = null; using (Mock.Property(() => Clock.UtcNowFunc, () => _dateTime)) { actual = _bundleFactory.CreateSearchBundle(searchResult); } // Since there is no continuation token, there should not be next link. Assert.Null(actual.Scalar <string>("Bundle.link.where(relation='next').url")); Assert.Collection( actual.ToPoco <Bundle>().Entry, e => ValidateEntry(observation1.ToPoco <Observation>(), e), e => ValidateEntry(observation2.ToPoco <Observation>(), e)); ResourceWrapper CreateResourceWrapper(ResourceElement resourceElement) { return(new ResourceWrapper( resourceElement, new RawResource(_fhirJsonSerializer.SerializeToString(resourceElement.ToPoco <Observation>()), FhirResourceFormat.Json), null, false, null, null, null)); } void ValidateEntry(Observation expected, Bundle.EntryComponent actualEntry) { Assert.NotNull(actualEntry); Assert.NotNull(actualEntry.Resource); Assert.Equal(expected.Id, actualEntry.Resource.Id); Assert.Equal(string.Format(_resourceUrlFormat, expected.Id), actualEntry.FullUrl); Assert.NotNull(actualEntry.Search); Assert.Equal(Bundle.SearchEntryMode.Match, actualEntry.Search.Mode); } }
public static FhirResult SetLocationHeader(this FhirResult fhirResult, IUrlResolver urlResolver) { var resource = fhirResult.Resource; if (!string.IsNullOrEmpty(resource.Id) && !string.IsNullOrWhiteSpace(resource.Meta.VersionId)) { var url = urlResolver.ResolveResourceUrl(resource, true); if (url.IsAbsoluteUri) { fhirResult.Headers.Add(HeaderNames.Location, url.AbsoluteUri); } } return(fhirResult); }