From 4280cba8d79d5bcdfda2771c2baa612fcb00052f Mon Sep 17 00:00:00 2001
From: Taras <tarassmakula@gmail.com>
Date: Sun, 13 Mar 2022 12:43:32 +0200
Subject: [PATCH] Update error parser for token validation

---
 .../java/com/futo/circles/core/Constants.kt   | 11 ++++++--
 .../java/com/futo/circles/core/ErrorParser.kt | 26 +++++++++++++++++++
 .../com/futo/circles/core/ReflectionUtils.kt  |  2 +-
 .../circles/extensions/LiveDataExtensions.kt  |  5 ++--
 .../RegistrationWizardExtensions.kt           |  8 +++---
 .../data_source/CreateGroupDataSource.kt      |  2 +-
 .../circles/feature/groups/GroupsViewModel.kt |  2 +-
 .../data_source/SelectUsersDataSource.kt      |  2 +-
 8 files changed, 46 insertions(+), 12 deletions(-)
 create mode 100644 app/src/main/java/com/futo/circles/core/ErrorParser.kt

diff --git a/app/src/main/java/com/futo/circles/core/Constants.kt b/app/src/main/java/com/futo/circles/core/Constants.kt
index 7ca9158d6..372f11834 100644
--- a/app/src/main/java/com/futo/circles/core/Constants.kt
+++ b/app/src/main/java/com/futo/circles/core/Constants.kt
@@ -1,4 +1,11 @@
-package com.futo.circles.utils
+package com.futo.circles.core
 
 const val GROUP_TAG = "social.kombucha.group"
-const val DEFAULT_USER_PREFIX = "@notices:"
\ No newline at end of file
+const val DEFAULT_USER_PREFIX = "@notices:"
+
+
+const val DEFAULT_ERROR_MESSAGE = "Something went wrong"
+const val AUTH_EXCEPTION_REASON_KEY = "reason"
+
+const val PENDING_SESSION_PROPERTY_NAME = "pendingSessionData"
+const val CURRENT_SESSION_PROPERTY_NAME = "currentSession"
\ No newline at end of file
diff --git a/app/src/main/java/com/futo/circles/core/ErrorParser.kt b/app/src/main/java/com/futo/circles/core/ErrorParser.kt
new file mode 100644
index 000000000..8f945aff1
--- /dev/null
+++ b/app/src/main/java/com/futo/circles/core/ErrorParser.kt
@@ -0,0 +1,26 @@
+package com.futo.circles.core
+
+import org.json.JSONObject
+import org.matrix.android.sdk.api.failure.Failure
+import retrofit2.HttpException
+
+object ErrorParser {
+
+
+    fun getErrorMessage(t: Throwable): String =
+        handleErrorBodyException(t) ?: handleServerException(t) ?: DEFAULT_ERROR_MESSAGE
+
+
+    private fun handleErrorBodyException(t: Throwable): String? =
+        (t as? HttpException)?.response()?.errorBody()?.string()?.let {
+            try {
+                JSONObject(it).getString(AUTH_EXCEPTION_REASON_KEY)
+            } catch (e: Exception) {
+                null
+            }
+        }
+
+    private fun handleServerException(t: Throwable): String? =
+        (t as? Failure.ServerError)?.error?.message ?: t.message
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/futo/circles/core/ReflectionUtils.kt b/app/src/main/java/com/futo/circles/core/ReflectionUtils.kt
index 59aa78629..50931f79a 100644
--- a/app/src/main/java/com/futo/circles/core/ReflectionUtils.kt
+++ b/app/src/main/java/com/futo/circles/core/ReflectionUtils.kt
@@ -1,4 +1,4 @@
-package com.futo.circles.utils
+package com.futo.circles.core
 
 fun <T : Any> T.getPrivateProperty(variableName: String): Any? {
     return javaClass.getDeclaredField(variableName).let { field ->
diff --git a/app/src/main/java/com/futo/circles/extensions/LiveDataExtensions.kt b/app/src/main/java/com/futo/circles/extensions/LiveDataExtensions.kt
index 037a1c64a..f32b7633e 100644
--- a/app/src/main/java/com/futo/circles/extensions/LiveDataExtensions.kt
+++ b/app/src/main/java/com/futo/circles/extensions/LiveDataExtensions.kt
@@ -2,9 +2,9 @@ package com.futo.circles.extensions
 
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.LiveData
+import com.futo.circles.core.ErrorParser
 import com.futo.circles.core.HasLoadingState
 import com.futo.circles.core.SingleEventLiveData
-import org.matrix.android.sdk.api.failure.Failure
 
 fun <T> SingleEventLiveData<Response<T>>.observeResponse(
     hasLoadingState: HasLoadingState,
@@ -35,8 +35,7 @@ suspend fun <T> createResult(block: suspend () -> T): Response<T> {
     return try {
         Response.Success(block())
     } catch (t: Throwable) {
-        val message = (t as? Failure.ServerError)?.error?.message ?: t.message
-        Response.Error(message ?: "Something went wrong")
+        Response.Error(ErrorParser.getErrorMessage(t))
     }
 }
 
diff --git a/app/src/main/java/com/futo/circles/extensions/RegistrationWizardExtensions.kt b/app/src/main/java/com/futo/circles/extensions/RegistrationWizardExtensions.kt
index c15128010..839ebb5f0 100644
--- a/app/src/main/java/com/futo/circles/extensions/RegistrationWizardExtensions.kt
+++ b/app/src/main/java/com/futo/circles/extensions/RegistrationWizardExtensions.kt
@@ -1,8 +1,10 @@
 package com.futo.circles.extensions
 
-import com.futo.circles.utils.getPrivateProperty
+import com.futo.circles.core.CURRENT_SESSION_PROPERTY_NAME
+import com.futo.circles.core.PENDING_SESSION_PROPERTY_NAME
+import com.futo.circles.core.getPrivateProperty
 import org.matrix.android.sdk.api.auth.registration.RegistrationWizard
 
 fun RegistrationWizard.getPendingSignUpSessionId() =
-    getPrivateProperty("pendingSessionData")
-        ?.getPrivateProperty("currentSession")?.toString() ?: ""
\ No newline at end of file
+    getPrivateProperty(PENDING_SESSION_PROPERTY_NAME)
+        ?.getPrivateProperty(CURRENT_SESSION_PROPERTY_NAME)?.toString() ?: ""
\ No newline at end of file
diff --git a/app/src/main/java/com/futo/circles/feature/create_group/data_source/CreateGroupDataSource.kt b/app/src/main/java/com/futo/circles/feature/create_group/data_source/CreateGroupDataSource.kt
index 38ae86c6c..5b41d4ef1 100644
--- a/app/src/main/java/com/futo/circles/feature/create_group/data_source/CreateGroupDataSource.kt
+++ b/app/src/main/java/com/futo/circles/feature/create_group/data_source/CreateGroupDataSource.kt
@@ -4,7 +4,7 @@ import android.net.Uri
 import com.futo.circles.extensions.createResult
 import com.futo.circles.model.UserListItem
 import com.futo.circles.provider.MatrixSessionProvider
-import com.futo.circles.utils.GROUP_TAG
+import com.futo.circles.core.GROUP_TAG
 import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility
 import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
 import org.matrix.android.sdk.api.session.room.model.create.CreateRoomPreset
diff --git a/app/src/main/java/com/futo/circles/feature/groups/GroupsViewModel.kt b/app/src/main/java/com/futo/circles/feature/groups/GroupsViewModel.kt
index a8fd123bb..0baed56b3 100644
--- a/app/src/main/java/com/futo/circles/feature/groups/GroupsViewModel.kt
+++ b/app/src/main/java/com/futo/circles/feature/groups/GroupsViewModel.kt
@@ -4,7 +4,7 @@ import androidx.lifecycle.ViewModel
 import androidx.lifecycle.map
 import com.futo.circles.extensions.toGroupsList
 import com.futo.circles.provider.MatrixSessionProvider
-import com.futo.circles.utils.GROUP_TAG
+import com.futo.circles.core.GROUP_TAG
 import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
 
 
diff --git a/app/src/main/java/com/futo/circles/feature/select_users/data_source/SelectUsersDataSource.kt b/app/src/main/java/com/futo/circles/feature/select_users/data_source/SelectUsersDataSource.kt
index 4a6a9959e..48ba04c96 100644
--- a/app/src/main/java/com/futo/circles/feature/select_users/data_source/SelectUsersDataSource.kt
+++ b/app/src/main/java/com/futo/circles/feature/select_users/data_source/SelectUsersDataSource.kt
@@ -7,7 +7,7 @@ import com.futo.circles.model.InviteMemberListItem
 import com.futo.circles.model.NoResultsItem
 import com.futo.circles.model.UserListItem
 import com.futo.circles.provider.MatrixSessionProvider
-import com.futo.circles.utils.DEFAULT_USER_PREFIX
+import com.futo.circles.core.DEFAULT_USER_PREFIX
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.*
 import org.matrix.android.sdk.api.session.user.model.User
-- 
GitLab