From 85fb8cfa8698e93559891b4cb3a6b02c875991ce Mon Sep 17 00:00:00 2001 From: Kenneth Myhra Date: Sun, 5 Sep 2021 12:20:48 +0200 Subject: [PATCH] feature: Add GET interaction support for transaction bundles This adds support for GET interaction in batch/transaction bundles. Fixes #305 --- src/Spark.Engine/Core/Interaction.cs | 5 +++ .../GetManipulationOperation.cs | 38 +++++++++++++++++++ .../ResourceManipulationOperationFactory.cs | 20 +++++++++- 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 src/Spark.Engine/Service/FhirServiceExtensions/GetManipulationOperation.cs diff --git a/src/Spark.Engine/Core/Interaction.cs b/src/Spark.Engine/Core/Interaction.cs index 3fba9d2a9..a0518961d 100644 --- a/src/Spark.Engine/Core/Interaction.cs +++ b/src/Spark.Engine/Core/Interaction.cs @@ -89,6 +89,11 @@ public static Entry Create(Bundle.HTTPVerb method, Resource resource) return new Entry(method, null, null, resource); } + public static Entry Create(Bundle.HTTPVerb method, IKey key) + { + return new Entry(method, key, null, null); + } + public static Entry Create(Bundle.HTTPVerb method, IKey key, Resource resource) { return new Entry(method, key, null, resource); diff --git a/src/Spark.Engine/Service/FhirServiceExtensions/GetManipulationOperation.cs b/src/Spark.Engine/Service/FhirServiceExtensions/GetManipulationOperation.cs new file mode 100644 index 000000000..a19d9f69a --- /dev/null +++ b/src/Spark.Engine/Service/FhirServiceExtensions/GetManipulationOperation.cs @@ -0,0 +1,38 @@ +using Hl7.Fhir.Model; +using Hl7.Fhir.Rest; +using Spark.Engine.Core; +using System; +using System.Collections.Generic; + +namespace Spark.Engine.Service.FhirServiceExtensions +{ + public class GetManipulationOperation : ResourceManipulationOperation + { + public GetManipulationOperation(Resource resource, IKey operationKey, SearchResults searchResults, SearchParams searchCommand = null) + : base(resource, operationKey, searchResults, searchCommand) + { + } + + public static Uri ReadSearchUri(Bundle.EntryComponent entry) + { + return entry.Request != null + ? new Uri(entry.Request.Url, UriKind.RelativeOrAbsolute) + : null; + } + + protected override IEnumerable ComputeEntries() + { + if (SearchResults != null) + { + foreach (string localKeyLiteral in SearchResults) + { + yield return Entry.Create(Bundle.HTTPVerb.GET, Key.ParseOperationPath(localKeyLiteral)); + } + } + else + { + yield return Entry.Create(Bundle.HTTPVerb.GET, OperationKey); + } + } + } +} \ No newline at end of file diff --git a/src/Spark.Engine/Service/FhirServiceExtensions/ResourceManipulationOperationFactory.cs b/src/Spark.Engine/Service/FhirServiceExtensions/ResourceManipulationOperationFactory.cs index 81ab34470..302341aa9 100644 --- a/src/Spark.Engine/Service/FhirServiceExtensions/ResourceManipulationOperationFactory.cs +++ b/src/Spark.Engine/Service/FhirServiceExtensions/ResourceManipulationOperationFactory.cs @@ -22,14 +22,16 @@ static ResourceManipulationOperationFactory() { { Bundle.HTTPVerb.POST, CreatePost }, { Bundle.HTTPVerb.PUT, CreatePut }, - { Bundle.HTTPVerb.DELETE, CreateDelete } + { Bundle.HTTPVerb.DELETE, CreateDelete }, + { Bundle.HTTPVerb.GET, CreateGet }, }; _asyncBuilders = new Dictionary>> { { Bundle.HTTPVerb.POST, CreatePostAsync }, { Bundle.HTTPVerb.PUT, CreatePutAsync }, - { Bundle.HTTPVerb.DELETE, CreateDeleteAsync } + { Bundle.HTTPVerb.DELETE, CreateDeleteAsync }, + { Bundle.HTTPVerb.GET, CreateGetAsync }, }; } @@ -91,6 +93,16 @@ private static async Task CreateDeleteAsync(Resou return new DeleteManipulationOperation(null, key, await GetSearchResultAsync(key, searchService, searchParams).ConfigureAwait(false), searchParams); } + private static ResourceManipulationOperation CreateGet(Resource resource, IKey key, ISearchService searchService, SearchParams searchParams) + { + return new GetManipulationOperation(resource, key, GetSearchResult(key, searchService, searchParams), searchParams); + } + + private static async Task CreateGetAsync(Resource resource, IKey key, ISearchService searchService, SearchParams searchParams) + { + return new GetManipulationOperation(resource, key, await GetSearchResultAsync(key, searchService, searchParams), searchParams); + } + public static ResourceManipulationOperation GetManipulationOperation(Bundle.EntryComponent entryComponent, ILocalhost localhost, ISearchService searchService = null) { Bundle.HTTPVerb method = localhost.ExtrapolateMethod(entryComponent, null); @@ -127,6 +139,10 @@ private static Uri GetSearchUri(Bundle.EntryComponent entryComponent, Bundle.HTT { searchUri = DeleteManipulationOperation.ReadSearchUri(entryComponent); } + else if (method == Bundle.HTTPVerb.GET) + { + searchUri = FhirServiceExtensions.GetManipulationOperation.ReadSearchUri(entryComponent); + } return searchUri; }