Skip to content

Commit

Permalink
feat: handle non federated domain connection request (WPB-2219) (#2068)
Browse files Browse the repository at this point in the history
  • Loading branch information
yamilmedina committed Aug 8, 2023
1 parent b875f2b commit 5e3a9e3
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,24 @@ class ConnectionActionButtonViewModelImpl @Inject constructor(
viewModelScope.launch {
state = state.performAction()
when (sendConnectionRequest(userId)) {
is SendConnectionRequestResult.Failure -> {
appLogger.e(("Couldn't send a connection request to user ${userId.toLogString()}"))
is SendConnectionRequestResult.Success -> {
state = state.finishAction()
_infoMessage.emit(UIText.StringResource(R.string.connection_request_sent_error))
_infoMessage.emit(UIText.StringResource(R.string.connection_request_sent))
}

is SendConnectionRequestResult.Success -> {
is SendConnectionRequestResult.Failure.FederationDenied -> {
state = state.finishAction()
_infoMessage.emit(UIText.StringResource(R.string.connection_request_sent))
_infoMessage.emit(
UIText.StringResource(
R.string.connection_request_sent_federation_denied_error,
userName
)
)
}

is SendConnectionRequestResult.Failure.GenericFailure -> {
state = state.finishAction()
_infoMessage.emit(UIText.StringResource(R.string.connection_request_sent_error))
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ class AddMembersToConversationViewModel @Inject constructor(
}
}

override fun getInitialContacts(): Flow<SearchResult> =
override suspend fun getInitialContacts(): Flow<SearchResult> =
getAllContactsNotInConversation(conversationId).map { result ->
when (result) {
is Result.Failure -> SearchResult.Failure(R.string.label_general_error)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ open class SearchAllPeopleViewModel(
}
}

override fun getInitialContacts(): Flow<SearchResult> = getAllKnownUsers()
override suspend fun getInitialContacts(): Flow<SearchResult> = getAllKnownUsers()
.map { result ->
when (result) {
is GetAllContactsResult.Failure -> SearchResult.Failure(R.string.label_general_error)
Expand Down Expand Up @@ -211,13 +211,13 @@ abstract class PublicWithKnownPeopleSearchViewModel(
val userId = UserId(contact.id, contact.domain)

when (sendConnectionRequest(userId)) {
is SendConnectionRequestResult.Failure -> {
appLogger.d(("Couldn't send a connect request to user $userId"))
}

is SendConnectionRequestResult.Success -> {
mutableInfoMessage.emit(SearchPeopleMessageType.SuccessConnectionSentRequest.uiText)
}

is SendConnectionRequestResult.Failure.FederationDenied, is SendConnectionRequestResult.Failure.GenericFailure -> {
appLogger.d(("Couldn't send a connect request to user $userId"))
}
}
}
}
Expand Down Expand Up @@ -250,11 +250,12 @@ abstract class SearchPeopleViewModel : ViewModel() {
.asStateFlow()
.debounce(DEFAULT_SEARCH_QUERY_DEBOUNCE)

fun initialContactResultFlow() = getInitialContacts().map { result ->
suspend fun initialContactResultFlow() = getInitialContacts().map { result ->
when (result) {
is SearchResult.Failure -> {
SearchResultState.Failure(result.failureString)
}

is SearchResult.Success -> {
SearchResultState.Success(
result
Expand Down Expand Up @@ -324,7 +325,7 @@ abstract class SearchPeopleViewModel : ViewModel() {
}
}

abstract fun getInitialContacts(): Flow<SearchResult>
abstract suspend fun getInitialContacts(): Flow<SearchResult>

abstract suspend fun getInitialServices(): Flow<SearchResult>
}
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -767,6 +767,7 @@
<string name="connection_request_ignored">You ignored %1$s\'s request</string>
<string name="connection_request_accepted">Connection request accepted</string>
<string name="connection_request_sent_error">Connection request could not be sent</string>
<string name="connection_request_sent_federation_denied_error">Your backend does not federate with the backend of %1$s. You can not connect with them.</string>
<string name="connection_request_accept_error">Connection request could not be accepted</string>
<string name="connection_request_ignore_error">Connection request could not be ignored</string>
<string name="connection_request_cancel_error">Connection request could not be canceled</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ class ConnectionActionButtonViewModelTest {
fun `given a failure, when sending a connection request, then emit failure message`() = runTest {
// given
val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement()
.withSendConnectionRequest(SendConnectionRequestResult.Failure(failure))
.withSendConnectionRequest(SendConnectionRequestResult.Failure.GenericFailure(failure))
.arrange()

viewModel.infoMessage.test {
Expand All @@ -103,6 +103,25 @@ class ConnectionActionButtonViewModelTest {
}
}

@Test
fun `given a federation denied failure, when sending a connection request, then emit proper failure message`() = runTest {
// given
val (arrangement, viewModel) = ConnectionActionButtonHiltArrangement()
.withSendConnectionRequest(SendConnectionRequestResult.Failure.FederationDenied)
.arrange()

viewModel.infoMessage.test {
// when
viewModel.onSendConnectionRequest()

// then
val result = awaitItem() as UIText.StringResource
assertEquals(UIText.StringResource(R.string.connection_request_sent_federation_denied_error, "").resId, result.resId)
coVerify(exactly = 1) { arrangement.sendConnectionRequest.invoke(eq(TestUser.USER_ID)) }
assertEquals(false, viewModel.actionableState().isPerformingAction)
}
}

@Test
fun `given success, when ignoring a connection request, then calls onIgnoreSuccess`() =
runTest {
Expand Down
2 changes: 1 addition & 1 deletion kalium
Submodule kalium updated 31 files
+1 βˆ’1 cryptography/src/commonTest/kotlin/com/wire/kalium/cryptography/E2EIClientTest.kt
+7 βˆ’1 logic/src/commonMain/kotlin/com/wire/kalium/logic/CoreFailure.kt
+4 βˆ’0 logic/src/commonMain/kotlin/com/wire/kalium/logic/data/event/Event.kt
+42 βˆ’8 logic/src/commonMain/kotlin/com/wire/kalium/logic/data/event/EventMapper.kt
+2 βˆ’1 logic/src/commonMain/kotlin/com/wire/kalium/logic/data/publicuser/PublicUserMapper.kt
+2 βˆ’2 logic/src/commonMain/kotlin/com/wire/kalium/logic/data/user/UserRepository.kt
+14 βˆ’8 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/UserSessionScope.kt
+9 βˆ’2 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/call/CallsScope.kt
+1 βˆ’3 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/call/usecase/EndCallOnConversationChangeUseCase.kt
+44 βˆ’0 ...monMain/kotlin/com/wire/kalium/logic/feature/call/usecase/UpdateConversationClientsForCurrentCallUseCase.kt
+15 βˆ’4 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/connection/SendConnectionRequestUseCase.kt
+2 βˆ’2 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/publicuser/GetAllContactsUseCase.kt
+3 βˆ’0 logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberLeaveEventHandler.kt
+2 βˆ’2 logic/src/commonTest/kotlin/com/wire/kalium/logic/data/user/UserRepositoryTest.kt
+1 βˆ’10 .../src/commonTest/kotlin/com/wire/kalium/logic/feature/call/usecase/EndCallOnConversationChangeUseCaseTest.kt
+108 βˆ’0 ...est/kotlin/com/wire/kalium/logic/feature/call/usecase/UpdateConversationClientsForCurrentCallUseCaseTest.kt
+46 βˆ’24 logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/connection/SendConnectionRequestUseCaseTest.kt
+0 βˆ’2 logic/src/commonTest/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberJoinEventHandlerTest.kt
+147 βˆ’0 logic/src/commonTest/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberLeaveEventHandlerTest.kt
+3 βˆ’1 network/src/commonMain/kotlin/com/wire/kalium/network/api/base/authenticated/notification/EventContentDTO.kt
+2 βˆ’2 network/src/commonMain/kotlin/com/wire/kalium/network/api/v0/authenticated/ConnectionApiV0.kt
+18 βˆ’1 network/src/commonMain/kotlin/com/wire/kalium/network/api/v4/authenticated/ConnectionApiV4.kt
+3 βˆ’16 network/src/commonMain/kotlin/com/wire/kalium/network/api/v4/authenticated/ConversationApiV4.kt
+6 βˆ’1 network/src/commonMain/kotlin/com/wire/kalium/network/exceptions/KaliumException.kt
+2 βˆ’0 network/src/commonMain/kotlin/com/wire/kalium/network/exceptions/NetworkErrorLabel.kt
+35 βˆ’0 network/src/commonMain/kotlin/com/wire/kalium/network/utils/NetworkUtils.kt
+98 βˆ’0 network/src/commonTest/kotlin/com/wire/kalium/api/v4/ConnectionApiV4Test.kt
+1 βˆ’1 persistence/src/commonMain/db_user/com/wire/kalium/persistence/Users.sq
+1 βˆ’1 persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/UserDAO.kt
+74 βˆ’74 persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/UserDAOImpl.kt
+33 βˆ’1 persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/UserDAOTest.kt

0 comments on commit 5e3a9e3

Please sign in to comment.