Skip to content

Commit 76d6385

Browse files
fix: update user connection status after cancelling request (#2416)
* fix: update user connection status after cancelling request (#2412) * trigger build --------- Co-authored-by: Michał Saleniuk <[email protected]> Co-authored-by: Michał Saleniuk <[email protected]>
1 parent c663cf9 commit 76d6385

File tree

5 files changed

+37
-22
lines changed

5 files changed

+37
-22
lines changed

logic/src/commonMain/kotlin/com/wire/kalium/logic/data/connection/ConnectionRepository.kt

+6-5
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import com.wire.kalium.logic.StorageFailure
2525
import com.wire.kalium.logic.data.conversation.ConversationDetails
2626
import com.wire.kalium.logic.data.conversation.ConversationRepository
2727
import com.wire.kalium.logic.data.event.Event
28-
import com.wire.kalium.logic.data.id.ConversationId
2928
import com.wire.kalium.logic.data.id.toApi
3029
import com.wire.kalium.logic.data.id.toDao
3130
import com.wire.kalium.logic.data.user.Connection
@@ -54,6 +53,7 @@ import com.wire.kalium.network.api.base.authenticated.connection.ConnectionApi
5453
import com.wire.kalium.network.api.base.authenticated.connection.ConnectionDTO
5554
import com.wire.kalium.network.api.base.authenticated.connection.ConnectionStateDTO
5655
import com.wire.kalium.persistence.dao.ConnectionDAO
56+
import com.wire.kalium.persistence.dao.ConnectionEntity
5757
import com.wire.kalium.persistence.dao.UserDAO
5858
import com.wire.kalium.persistence.dao.conversation.ConversationDAO
5959
import com.wire.kalium.persistence.dao.conversation.ConversationEntity
@@ -74,7 +74,7 @@ interface ConnectionRepository {
7474
suspend fun observeConnectionRequestsForNotification(): Flow<List<ConversationDetails>>
7575
suspend fun setConnectionAsNotified(userId: UserId)
7676
suspend fun setAllConnectionsAsNotified()
77-
suspend fun deleteConnection(conversationId: ConversationId): Either<StorageFailure, Unit>
77+
suspend fun deleteConnection(connection: Connection): Either<StorageFailure, Unit>
7878
}
7979

8080
@Suppress("LongParameterList", "TooManyFunctions")
@@ -249,8 +249,9 @@ internal class ConnectionDataSource(
249249
}
250250
}
251251

252-
override suspend fun deleteConnection(conversationId: ConversationId) = wrapStorageRequest {
253-
connectionDAO.deleteConnectionDataAndConversation(conversationId.toDao())
252+
override suspend fun deleteConnection(connection: Connection) = wrapStorageRequest {
253+
connectionDAO.deleteConnectionDataAndConversation(connection.qualifiedConversationId.toDao())
254+
userDAO.upsertConnectionStatuses(mapOf(connection.qualifiedToId.toDao() to ConnectionEntity.State.CANCELLED))
254255
}
255256

256257
/**
@@ -260,6 +261,6 @@ internal class ConnectionDataSource(
260261
private suspend fun handleUserConnectionStatusPersistence(connection: Connection): Either<CoreFailure, Unit> =
261262
when (connection.status) {
262263
ACCEPTED, MISSING_LEGALHOLD_CONSENT, NOT_CONNECTED, PENDING, SENT, BLOCKED, IGNORED -> persistConnection(connection)
263-
CANCELLED -> deleteConnection(connection.qualifiedConversationId)
264+
CANCELLED -> deleteConnection(connection)
264265
}
265266
}

logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/FederationEventReceiver.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class FederationEventReceiverImpl internal constructor(
7676
if (conversationDetails is ConversationDetails.Connection
7777
&& conversationDetails.otherUser?.id?.domain == event.domain
7878
) {
79-
connectionRepository.deleteConnection(conversationDetails.conversationId)
79+
connectionRepository.deleteConnection(conversationDetails.connection)
8080
}
8181
}
8282
}

logic/src/commonTest/kotlin/com/wire/kalium/logic/data/connection/ConnectionRepositoryTest.kt

+12-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.wire.kalium.logic.data.id.toDao
2525
import com.wire.kalium.logic.data.user.ConnectionState
2626
import com.wire.kalium.logic.data.user.UserId
2727
import com.wire.kalium.logic.data.id.SelfTeamIdProvider
28+
import com.wire.kalium.logic.framework.TestConnection
2829
import com.wire.kalium.logic.framework.TestConversation
2930
import com.wire.kalium.logic.framework.TestUser
3031
import com.wire.kalium.logic.functional.Either
@@ -44,6 +45,7 @@ import com.wire.kalium.network.api.base.model.UserProfileDTO
4445
import com.wire.kalium.network.exceptions.KaliumException
4546
import com.wire.kalium.network.utils.NetworkResponse
4647
import com.wire.kalium.persistence.dao.ConnectionDAO
48+
import com.wire.kalium.persistence.dao.ConnectionEntity
4749
import com.wire.kalium.persistence.dao.QualifiedIDEntity
4850
import com.wire.kalium.persistence.dao.UserDAO
4951
import com.wire.kalium.persistence.dao.UserIDEntity
@@ -284,19 +286,27 @@ class ConnectionRepositoryTest {
284286
@Test
285287
fun givenConversationId_WhenDeletingConnection_thenDeleteConnectionDataAndConversationShouldBeTriggered() = runTest {
286288
// given
287-
val conversationId = com.wire.kalium.logic.data.id.QualifiedID("conversation_id", "domain_id")
289+
val conversationId = TestConversation.ID
288290
val (arrangement, connectionRepository) = Arrangement().arrange()
289291
arrangement.withDeleteConnectionDataAndConversation(conversationId.toDao())
292+
val connection = TestConnection.CONNECTION.copy(
293+
conversationId = conversationId.value,
294+
qualifiedConversationId = conversationId,
295+
)
290296

291297
// when
292-
val result = connectionRepository.deleteConnection(conversationId)
298+
val result = connectionRepository.deleteConnection(connection)
293299

294300
// then
295301
result.shouldSucceed()
296302
verify(arrangement.connectionDAO)
297303
.suspendFunction(arrangement.connectionDAO::deleteConnectionDataAndConversation)
298304
.with(eq(conversationId.toDao()))
299305
.wasInvoked(once)
306+
verify(arrangement.userDAO)
307+
.suspendFunction(arrangement.userDAO::upsertConnectionStatuses)
308+
.with(eq(mapOf(connection.qualifiedToId.toDao() to ConnectionEntity.State.CANCELLED)))
309+
.wasInvoked(once)
300310
}
301311

302312
private class Arrangement :

logic/src/commonTest/kotlin/com/wire/kalium/logic/sync/receiver/FederationEventReceiverTest.kt

+15-7
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ package com.wire.kalium.logic.sync.receiver
1919

2020
import com.wire.kalium.logic.data.event.Event
2121
import com.wire.kalium.logic.data.id.ConversationId
22-
import com.wire.kalium.logic.data.id.QualifiedID
2322
import com.wire.kalium.logic.data.id.toDao
23+
import com.wire.kalium.logic.data.user.Connection
2424
import com.wire.kalium.logic.data.user.UserId
25+
import com.wire.kalium.logic.framework.TestConnection
2526
import com.wire.kalium.logic.framework.TestConversationDetails
2627
import com.wire.kalium.logic.framework.TestUser
2728
import com.wire.kalium.logic.functional.Either
@@ -51,17 +52,24 @@ class FederationEventReceiverTest {
5152
@Test
5253
fun givenConversationsWithFederatedUsers_whenReceivingFederationDeleteEvent_thenAllConversationsWithThemShouldBeCleared() = runTest {
5354
// Given
55+
fun createConnection(conversationId: ConversationId, otherUserId: UserId) = TestConversationDetails.CONNECTION.copy(
56+
conversationId = conversationId,
57+
otherUser = TestUser.OTHER.copy(id = otherUserId),
58+
connection = TestConnection.CONNECTION.copy(
59+
qualifiedConversationId = conversationId,
60+
conversationId = conversationId.value,
61+
)
62+
)
5463
val defederatedConnections = List(defederatedUsersCount) {
55-
TestConversationDetails.CONNECTION.copy(
64+
createConnection(
5665
conversationId = ConversationId("def_connection$it", defederatedDomain),
57-
otherUser = TestUser.OTHER.copy(id = QualifiedID("connectionDefId$it", defederatedDomain))
66+
otherUserId = UserId("connectionDefId$it", defederatedDomain)
5867
)
5968
}
60-
6169
val otherConnections = List(defederatedUsersCount) {
62-
TestConversationDetails.CONNECTION.copy(
70+
createConnection(
6371
conversationId = ConversationId("other_connection$it", otherDomain),
64-
otherUser = TestUser.OTHER.copy(id = QualifiedID("connectionOtherId$it", otherDomain))
72+
otherUserId = UserId("connectionOtherId$it", otherDomain)
6573
)
6674
}
6775

@@ -109,7 +117,7 @@ class FederationEventReceiverTest {
109117

110118
verify(arrangement.connectionRepository)
111119
.suspendFunction(arrangement.connectionRepository::deleteConnection)
112-
.with(matching<ConversationId> { it.domain == defederatedDomain })
120+
.with(matching<Connection> { it.qualifiedConversationId.domain == defederatedDomain })
113121
.wasInvoked(exactly = defederatedConnections.size.time)
114122

115123
verify(arrangement.connectionRepository)

logic/src/commonTest/kotlin/com/wire/kalium/logic/util/arrangement/repository/ConnectionRepositoryArrangement.kt

+3-7
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,10 @@ import com.wire.kalium.logic.CoreFailure
2121
import com.wire.kalium.logic.StorageFailure
2222
import com.wire.kalium.logic.data.connection.ConnectionRepository
2323
import com.wire.kalium.logic.data.conversation.ConversationDetails
24-
import com.wire.kalium.logic.data.id.ConversationId
2524
import com.wire.kalium.logic.data.user.Connection
26-
import com.wire.kalium.logic.data.user.ConnectionState
27-
import com.wire.kalium.logic.feature.connection.AcceptConnectionRequestUseCaseTest
2825
import com.wire.kalium.logic.functional.Either
2926
import io.mockative.Mock
3027
import io.mockative.any
31-
import io.mockative.eq
3228
import io.mockative.given
3329
import io.mockative.matchers.Matcher
3430
import io.mockative.mock
@@ -38,7 +34,7 @@ internal interface ConnectionRepositoryArrangement {
3834
val connectionRepository: ConnectionRepository
3935

4036
fun withGetConnections(result: Either<StorageFailure, Flow<List<ConversationDetails>>>)
41-
fun withDeleteConnection(result: Either<StorageFailure, Unit>, conversationId: Matcher<ConversationId> = any())
37+
fun withDeleteConnection(result: Either<StorageFailure, Unit>, connection: Matcher<Connection> = any())
4238
fun withConnectionList(connectionsFlow: Flow<List<ConversationDetails>>)
4339
fun withUpdateConnectionStatus(result: Either<CoreFailure, Connection>)
4440
}
@@ -58,11 +54,11 @@ internal open class ConnectionRepositoryArrangementImpl : ConnectionRepositoryAr
5854

5955
override fun withDeleteConnection(
6056
result: Either<StorageFailure, Unit>,
61-
conversationId: Matcher<ConversationId>,
57+
connection: Matcher<Connection>,
6258
) {
6359
given(connectionRepository)
6460
.suspendFunction(connectionRepository::deleteConnection)
65-
.whenInvokedWith(conversationId)
61+
.whenInvokedWith(connection)
6662
.thenReturn(result)
6763
}
6864

0 commit comments

Comments
 (0)