Skip to content

Commit

Permalink
Introducing Upload Strategies (#2171)
Browse files Browse the repository at this point in the history
* refactoring for upload request generator

* spotless application

* spotless application

* added UploadRequestGeneratorFactory

* Spotless applications

* review comments

* Upload Strategy

* Adding factories

* patch generator mode in same class as patch generator

* making local fetch mode not internal

* addressed review comments

* using bundle request
  • Loading branch information
anchita-g committed Sep 21, 2023
1 parent 3baeac7 commit 49ec45c
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
/*
* Copyright 2023 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.google.android.fhir.sync.upload

import com.google.android.fhir.sync.upload.patch.PatchGeneratorMode
import com.google.android.fhir.sync.upload.request.UploadRequestGeneratorMode
import org.hl7.fhir.r4.model.Bundle
import org.hl7.fhir.r4.model.codesystems.HttpVerb

/**
* Strategy to define how to upload the [LocalChange]s to the FHIR server.
*
* Each strategy comprises of deciding appropriate modes for [LocalChangeFetcher],
* [PatchGeneratorMode], [UploadRequestGeneratorMode]. The strategies mentioned here are exhaustive
* as the different modes for the components mentioned above can only be used together in some
* specific ways.
*/
sealed class UploadStrategy
private constructor(
internal val localChangesFetchMode: LocalChangesFetchMode,
internal val patchGeneratorMode: PatchGeneratorMode,
internal val requestGeneratorMode: UploadRequestGeneratorMode,
) {
object SingleChangePut :
UploadStrategy(
LocalChangesFetchMode.EarliestChange,
PatchGeneratorMode.PerChange,
UploadRequestGeneratorMode.UrlRequest(HttpVerb.PUT, HttpVerb.PATCH),
)

object SingleChangePost :
UploadStrategy(
LocalChangesFetchMode.EarliestChange,
PatchGeneratorMode.PerChange,
UploadRequestGeneratorMode.UrlRequest(HttpVerb.POST, HttpVerb.PATCH),
)

object SingleResourcePut :
UploadStrategy(
LocalChangesFetchMode.PerResource,
PatchGeneratorMode.PerResource,
UploadRequestGeneratorMode.UrlRequest(HttpVerb.PUT, HttpVerb.PATCH),
)

object SingleResourcePost :
UploadStrategy(
LocalChangesFetchMode.PerResource,
PatchGeneratorMode.PerResource,
UploadRequestGeneratorMode.UrlRequest(HttpVerb.POST, HttpVerb.PATCH),
)

object AllChangesBundlePut :
UploadStrategy(
LocalChangesFetchMode.AllChanges,
PatchGeneratorMode.PerChange,
UploadRequestGeneratorMode.BundleRequest(Bundle.HTTPVerb.PUT, Bundle.HTTPVerb.PATCH),
)

object AllChangesBundlePost :
UploadStrategy(
LocalChangesFetchMode.AllChanges,
PatchGeneratorMode.PerChange,
UploadRequestGeneratorMode.BundleRequest(Bundle.HTTPVerb.POST, Bundle.HTTPVerb.PATCH),
)

object AllChangesSquashedBundlePut :
UploadStrategy(
LocalChangesFetchMode.AllChanges,
PatchGeneratorMode.PerResource,
UploadRequestGeneratorMode.BundleRequest(Bundle.HTTPVerb.PUT, Bundle.HTTPVerb.PATCH),
)

object AllChangesSquashedBundlePost :
UploadStrategy(
LocalChangesFetchMode.AllChanges,
PatchGeneratorMode.PerResource,
UploadRequestGeneratorMode.BundleRequest(Bundle.HTTPVerb.POST, Bundle.HTTPVerb.PATCH),
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,22 @@ internal interface PatchGenerator {
*/
fun generate(localChanges: List<LocalChange>): List<Patch>
}

internal object PatchGeneratorFactory {
fun byMode(
mode: PatchGeneratorMode,
): PatchGenerator =
when (mode) {
is PatchGeneratorMode.PerChange -> PerChangePatchGenerator
is PatchGeneratorMode.PerResource -> PerResourcePatchGenerator
}
}

/**
* Mode to decide the type of [PatchGenerator] that needs to be used to upload the [LocalChange]s
*/
internal sealed class PatchGeneratorMode {
object PerResource : PatchGeneratorMode()

object PerChange : PatchGeneratorMode()
}

0 comments on commit 49ec45c

Please sign in to comment.