From f641e86fd61c65de0df8aa8a2910a2208deb0a41 Mon Sep 17 00:00:00 2001 From: Martin Ndegwa Date: Wed, 23 Aug 2023 10:09:16 +0300 Subject: [PATCH] Add a SyncJobStatus result callback amid Sync retries - https://github.com/google/android-fhir/issues/2049 --- .../android/fhir/sync/FhirSyncWorker.kt | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/engine/src/main/java/com/google/android/fhir/sync/FhirSyncWorker.kt b/engine/src/main/java/com/google/android/fhir/sync/FhirSyncWorker.kt index 148e3f01a7..4fd823967d 100644 --- a/engine/src/main/java/com/google/android/fhir/sync/FhirSyncWorker.kt +++ b/engine/src/main/java/com/google/android/fhir/sync/FhirSyncWorker.kt @@ -91,6 +91,9 @@ abstract class FhirSyncWorker(appContext: Context, workerParams: WorkerParameter ) .apply { subscribe(flow) } .synchronize() + + if (result is SyncJobStatus.Failed) onFailedSyncJobResult(result) + val output = buildWorkData(result) // await/join is needed to collect states completely @@ -118,6 +121,32 @@ abstract class FhirSyncWorker(appContext: Context, workerParams: WorkerParameter } } + open fun onFailedSyncJobResult(failedSyncJobStatus: SyncJobStatus.Failed) { + try { + CoroutineScope(Dispatchers.IO).launch { + val jsonParser = FhirContext.forR4().newJsonParser() + + (result).exceptions.filterIsInstance().forEach { resourceSyncHTTPException -> + val operationOutcome = + jsonParser.parseResource( + IOUtils.toString( + resourceSyncHTTPException.response()?.errorBody()?.byteStream(), + StandardCharsets.UTF_8 + ) + ) as OperationOutcome + + operationOutcome.issue.forEach { operationOutcome -> + Timber.e( + "SERVER ${operationOutcome.severity} - HTTP ${resourceSyncHTTPException.code()} | Code - ${operationOutcome.code} | Diagnostics - ${operationOutcome.diagnostics}" + ) + } + } + } + } catch (e: Exception) { + Timber.e(e) + } + } + private fun buildWorkData(state: SyncJobStatus): Data { return workDataOf( // send serialized state and type so that consumer can convert it back