Skip to content

Commit 71d701d

Browse files
feat: handle legal hold failure result when sending connection [WPB-4395] (#2419)
* feat: handle legal hold failure result when sending connection [WPB-4395] * fix detekt --------- Co-authored-by: Yamil Medina <[email protected]>
1 parent 76d6385 commit 71d701d

File tree

4 files changed

+46
-1
lines changed

4 files changed

+46
-1
lines changed

logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/connection/SendConnectionRequestUseCase.kt

+17-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import com.wire.kalium.logic.data.user.UserRepository
2626
import com.wire.kalium.logic.functional.flatMap
2727
import com.wire.kalium.logic.functional.fold
2828
import com.wire.kalium.logic.kaliumLogger
29+
import com.wire.kalium.network.exceptions.KaliumException
30+
import com.wire.kalium.network.exceptions.isMissingLegalHoldConsent
2931

3032
/**
3133
* Use Case that allows a user send a connection request to connect with another User
@@ -53,13 +55,26 @@ internal class SendConnectionRequestUseCaseImpl(
5355
when (coreFailure) {
5456
is NetworkFailure.FederatedBackendFailure.FederationDenied ->
5557
SendConnectionRequestResult.Failure.FederationDenied
56-
58+
is NetworkFailure.ServerMiscommunication -> handleServerMissCommunicationError(coreFailure)
5759
else -> SendConnectionRequestResult.Failure.GenericFailure(coreFailure)
5860
}
5961
}, {
6062
SendConnectionRequestResult.Success
6163
})
6264
}
65+
66+
private fun handleServerMissCommunicationError(failure: NetworkFailure.ServerMiscommunication): SendConnectionRequestResult.Failure =
67+
when (failure.kaliumException) {
68+
is KaliumException.InvalidRequestError -> {
69+
with(failure.kaliumException) {
70+
when {
71+
isMissingLegalHoldConsent() -> SendConnectionRequestResult.Failure.MissingLegalHoldConsent
72+
else -> SendConnectionRequestResult.Failure.GenericFailure(failure)
73+
}
74+
}
75+
}
76+
else -> SendConnectionRequestResult.Failure.GenericFailure(failure)
77+
}
6378
}
6479

6580
sealed class SendConnectionRequestResult {
@@ -68,6 +83,7 @@ sealed class SendConnectionRequestResult {
6883
sealed class Failure : SendConnectionRequestResult() {
6984
class GenericFailure(val coreFailure: CoreFailure) : Failure()
7085
data object FederationDenied : Failure()
86+
data object MissingLegalHoldConsent : Failure()
7187
}
7288

7389
}

logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/connection/SendConnectionRequestUseCaseTest.kt

+26
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import com.wire.kalium.logic.data.connection.ConnectionRepository
2424
import com.wire.kalium.logic.data.user.UserId
2525
import com.wire.kalium.logic.data.user.UserRepository
2626
import com.wire.kalium.logic.functional.Either
27+
import com.wire.kalium.network.api.base.model.ErrorResponse
28+
import com.wire.kalium.network.exceptions.KaliumException
2729
import io.mockative.Mock
2830
import io.mockative.any
2931
import io.mockative.classOf
@@ -123,6 +125,30 @@ class SendConnectionRequestUseCaseTest {
123125
.wasInvoked(once)
124126
}
125127

128+
@Test
129+
fun givenAConnectionRequest_whenInvokingAndFailsByMissingLegalHoldConsent_thenShouldReturnsAMissingLegalHoldConsent() = runTest {
130+
// given
131+
val (arrangement, sendConnectionRequestUseCase) = Arrangement()
132+
.withFetchUserInfoResult(Either.Right(Unit))
133+
.withCreateConnectionResult(
134+
Either.Left(
135+
NetworkFailure.ServerMiscommunication(
136+
KaliumException.InvalidRequestError(ErrorResponse(403, "", "missing-legalhold-consent"))
137+
)
138+
)
139+
)
140+
.arrange()
141+
// when
142+
val resultFailure = sendConnectionRequestUseCase(userId)
143+
144+
// then
145+
assertEquals(SendConnectionRequestResult.Failure.MissingLegalHoldConsent::class, resultFailure::class)
146+
verify(arrangement.connectionRepository)
147+
.suspendFunction(arrangement.connectionRepository::sendUserConnection)
148+
.with(eq(userId))
149+
.wasInvoked(once)
150+
}
151+
126152
private class Arrangement {
127153
@Mock
128154
val connectionRepository = mock(classOf<ConnectionRepository>())

network/src/commonMain/kotlin/com/wire/kalium/network/exceptions/KaliumException.kt

+2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import com.wire.kalium.network.exceptions.NetworkErrorLabel.INVALID_EMAIL
4141
import com.wire.kalium.network.exceptions.NetworkErrorLabel.INVALID_HANDLE
4242
import com.wire.kalium.network.exceptions.NetworkErrorLabel.KEY_EXISTS
4343
import com.wire.kalium.network.exceptions.NetworkErrorLabel.MISSING_AUTH
44+
import com.wire.kalium.network.exceptions.NetworkErrorLabel.MISSING_LEGALHOLD_CONSENT
4445
import com.wire.kalium.network.exceptions.NetworkErrorLabel.MLS_CLIENT_MISMATCH
4546
import com.wire.kalium.network.exceptions.NetworkErrorLabel.MLS_COMMIT_MISSING_REFERENCES
4647
import com.wire.kalium.network.exceptions.NetworkErrorLabel.MLS_MISSING_GROUP_INFO
@@ -231,3 +232,4 @@ val KaliumException.InvalidRequestError.authenticationCodeFailure: Authenticatio
231232

232233
fun KaliumException.FederationError.isFederationDenied() = errorResponse.label == FEDERATION_DENIED
233234
fun KaliumException.FederationError.isFederationNotEnabled() = errorResponse.label == FEDERATION_NOT_ENABLED
235+
fun KaliumException.InvalidRequestError.isMissingLegalHoldConsent(): Boolean = errorResponse.label == MISSING_LEGALHOLD_CONSENT

network/src/commonMain/kotlin/com/wire/kalium/network/exceptions/NetworkErrorLabel.kt

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ internal object NetworkErrorLabel {
4949
const val ACCESS_DENIED = "access-denied"
5050
const val WRONG_CONVERSATION_PASSWORD = "invalid-conversation-password"
5151
const val NOT_FOUND = "not-found"
52+
const val MISSING_LEGALHOLD_CONSENT = "missing-legalhold-consent"
5253

5354
// Federation
5455
const val FEDERATION_FAILURE = "federation-remote-error"

0 commit comments

Comments
 (0)