Skip to content

Commit 16e4d90

Browse files
committed
chore(fc): wrap server errors to properly log them in services
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent e666182 commit 16e4d90

8 files changed

Lines changed: 211 additions & 78 deletions

File tree

libs/logging/src/main/kotlin/com/getcode/utils/ErrorUtils.kt

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,18 @@ object ErrorUtils {
2121
ErrorUtils.isDisplayErrors = isDisplayErrors
2222
}
2323

24+
private val ignoredErrors = listOf(
25+
UnknownHostException::class,
26+
TimeoutException::class,
27+
TimeoutCancellationException::class,
28+
ConnectException::class,
29+
)
30+
2431
fun handleError(throwable: Throwable) {
2532
if (isNetworkError(throwable) || isRuntimeError(throwable)) return
2633

2734
val throwableCause: Throwable =
28-
if (throwable.cause != null && (throwable is UndeliverableException || throwable is OnErrorNotImplementedException))
35+
if (throwable.cause != null && (throwable is UndeliverableException || throwable is OnErrorNotImplementedException || throwable is FlipchatServerError))
2936
throwable.cause ?: throwable
3037
else throwable
3138

@@ -41,10 +48,8 @@ object ErrorUtils {
4148

4249
if (
4350
BuildConfig.NOTIFY_ERRORS &&
44-
throwable !is UnknownHostException &&
45-
throwable !is TimeoutException &&
46-
throwable !is TimeoutCancellationException &&
47-
throwable !is ConnectException
51+
ignoredErrors.none { it.isInstance(throwable) } &&
52+
ignoredErrors.none { it.isInstance(throwableCause) }
4853
) {
4954
FirebaseCrashlytics.getInstance().recordException(throwable)
5055
if (Bugsnag.isStarted()) {
@@ -67,4 +72,4 @@ object ErrorUtils {
6772
throwable is SQLException || throwable is net.sqlcipher.SQLException || throwable is SuppressibleException || throwable is TimeoutCancellationException
6873
}
6974

70-
data class SuppressibleException(override val message: String): Throwable(message)
75+
data class SuppressibleException(override val message: String) : Throwable(message)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.getcode.utils
2+
3+
open class FlipchatServerError(
4+
override val message: String? = null,
5+
override val cause: Throwable? = null
6+
) : Throwable(
7+
message = "FlipchatServerError: $message",
8+
cause = cause
9+
)

services/flipchat/chat/src/main/kotlin/xyz/flipchat/services/internal/network/service/AccountService.kt

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import kotlinx.coroutines.flow.map
1212
import timber.log.Timber
1313
import xyz.flipchat.services.data.PaymentTarget
1414
import xyz.flipchat.services.internal.network.api.AccountApi
15+
import com.getcode.utils.FlipchatServerError
1516
import xyz.flipchat.services.internal.network.extensions.toPublicKey
1617
import javax.inject.Inject
1718

@@ -33,16 +34,19 @@ internal class AccountService @Inject constructor(
3334
Timber.e(t = error)
3435
Result.failure(error)
3536
}
37+
3638
RegisterResponse.Result.INVALID_DISPLAY_NAME -> {
3739
val error = RegisterError.InvalidDisplayName(response.errorReason)
3840
Timber.e(t = error)
3941
Result.failure(error)
4042
}
43+
4144
RegisterResponse.Result.UNRECOGNIZED -> {
4245
val error = RegisterError.Unrecognized(response.errorReason)
4346
Timber.e(t = error)
4447
Result.failure(error)
4548
}
49+
4650
else -> {
4751
val error = RegisterError.Other("Failed to register")
4852
Timber.e(t = error)
@@ -51,7 +55,10 @@ internal class AccountService @Inject constructor(
5155
}
5256
}.first()
5357
} catch (e: Exception) {
54-
val error = RegisterError.Other("Road to greatness is bumpy. Apologies for the hiccup.", cause = e)
58+
val error = RegisterError.Other(
59+
"Road to greatness is bumpy. Apologies for the hiccup.",
60+
cause = e
61+
)
5562
Result.failure(error)
5663
}
5764
}
@@ -76,11 +83,13 @@ internal class AccountService @Inject constructor(
7683
Timber.e(t = error)
7784
Result.failure(error)
7885
}
86+
7987
LoginResponse.Result.DENIED -> {
8088
val error = LoginError.Denied("Failed to login")
8189
Timber.e(t = error)
8290
Result.failure(error)
8391
}
92+
8493
else -> {
8594
val error = LoginError.Other("Failed to login")
8695
Timber.e(t = error)
@@ -89,7 +98,10 @@ internal class AccountService @Inject constructor(
8998
}
9099
}.first()
91100
} catch (e: Exception) {
92-
val error = RegisterError.Other("Road to greatness is bumpy. Apologies for the hiccup.", cause = e)
101+
val error = RegisterError.Other(
102+
"Road to greatness is bumpy. Apologies for the hiccup.",
103+
cause = e
104+
)
93105
Result.failure(error)
94106
}
95107
}
@@ -99,17 +111,22 @@ internal class AccountService @Inject constructor(
99111
networkOracle.managedRequest(api.getPaymentDestination(target))
100112
.map { response ->
101113
when (response.result) {
102-
AccountService.GetPaymentDestinationResponse.Result.OK -> Result.success(response.paymentDestination.toPublicKey())
114+
AccountService.GetPaymentDestinationResponse.Result.OK -> Result.success(
115+
response.paymentDestination.toPublicKey()
116+
)
117+
103118
AccountService.GetPaymentDestinationResponse.Result.NOT_FOUND -> {
104119
val error = GetPaymentDestinationError.NotFound()
105120
Timber.e(t = error)
106121
Result.failure(error)
107122
}
123+
108124
AccountService.GetPaymentDestinationResponse.Result.UNRECOGNIZED -> {
109125
val error = GetPaymentDestinationError.Unrecognized()
110126
Timber.e(t = error)
111127
Result.failure(error)
112128
}
129+
113130
else -> {
114131
val error = GetPaymentDestinationError.Other()
115132
Timber.e(t = error)
@@ -134,11 +151,13 @@ internal class AccountService @Inject constructor(
134151
Timber.e(t = error)
135152
Result.failure(error)
136153
}
154+
137155
AccountService.GetUserFlagsResponse.Result.UNRECOGNIZED -> {
138156
val error = GetUserFlagsError.Unrecognized()
139157
Timber.e(t = error)
140158
Result.failure(error)
141159
}
160+
142161
else -> {
143162
val error = GetUserFlagsError.Other()
144163
Timber.e(t = error)
@@ -152,28 +171,42 @@ internal class AccountService @Inject constructor(
152171
}
153172
}
154173

155-
sealed class LoginError(override val message: String): Throwable(message) {
156-
data class InvalidTimestamp(override val message: String): LoginError(message)
157-
data class NotFound(override val message: String): LoginError(message)
158-
data class Denied(override val message: String): LoginError(message)
159-
data class Unrecognized(override val message: String): LoginError(message)
160-
data class Other(override val message: String, override val cause: Throwable? = null): LoginError(message)
174+
sealed class LoginError(
175+
override val message: String? = null,
176+
override val cause: Throwable? = null
177+
) : FlipchatServerError(message, cause) {
178+
data class InvalidTimestamp(override val message: String) : LoginError(message)
179+
data class NotFound(override val message: String) : LoginError(message)
180+
data class Denied(override val message: String) : LoginError(message)
181+
data class Unrecognized(override val message: String) : LoginError(message)
182+
data class Other(override val message: String, override val cause: Throwable? = null) :
183+
LoginError(message, cause)
161184
}
162185

163-
sealed class RegisterError(override val message: String): Throwable(message) {
164-
data class InvalidSignature(override val message: String): RegisterError(message)
165-
data class InvalidDisplayName(override val message: String): RegisterError(message)
166-
data class Unrecognized(override val message: String): RegisterError(message)
167-
data class Other(override val message: String, override val cause: Throwable? = null): RegisterError(message)
186+
sealed class RegisterError(
187+
override val message: String? = null,
188+
override val cause: Throwable? = null
189+
) : FlipchatServerError(message, cause) {
190+
data class InvalidSignature(override val message: String) : RegisterError(message)
191+
data class InvalidDisplayName(override val message: String) : RegisterError(message)
192+
data class Unrecognized(override val message: String) : RegisterError(message)
193+
data class Other(override val message: String, override val cause: Throwable? = null) :
194+
RegisterError(message)
168195
}
169196

170-
sealed class GetPaymentDestinationError : Throwable() {
197+
sealed class GetPaymentDestinationError(
198+
override val message: String? = null,
199+
override val cause: Throwable? = null
200+
) : FlipchatServerError(message, cause) {
171201
class Unrecognized : GetPaymentDestinationError()
172202
class NotFound : GetPaymentDestinationError()
173203
data class Other(override val cause: Throwable? = null) : GetPaymentDestinationError()
174204
}
175205

176-
sealed class GetUserFlagsError : Throwable() {
206+
sealed class GetUserFlagsError(
207+
override val message: String? = null,
208+
override val cause: Throwable? = null
209+
) : FlipchatServerError(message, cause) {
177210
class Unrecognized : GetUserFlagsError()
178211
class Denied : GetUserFlagsError()
179212
data class Other(override val cause: Throwable? = null) : GetUserFlagsError()

0 commit comments

Comments
 (0)