Skip to content

Commit

Permalink
fix: folders slow sync [WPB-14396] (#3146)
Browse files Browse the repository at this point in the history
* fix: made folders sync as optional during slow sync

* move first sync to fetch fav folder

* test fix

* removed unused use case
  • Loading branch information
Garzas authored Dec 6, 2024
1 parent d2b92a0 commit 3d7c712
Show file tree
Hide file tree
Showing 10 changed files with 55 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,5 @@ enum class SlowSyncStep {
CONTACTS,
JOINING_MLS_CONVERSATIONS,
RESOLVE_ONE_ON_ONE_PROTOCOLS,
LEGAL_HOLD,
CONVERSATION_FOLDERS,
LEGAL_HOLD
}
Original file line number Diff line number Diff line change
Expand Up @@ -210,8 +210,6 @@ import com.wire.kalium.logic.feature.conversation.RecoverMLSConversationsUseCase
import com.wire.kalium.logic.feature.conversation.SyncConversationsUseCase
import com.wire.kalium.logic.feature.conversation.SyncConversationsUseCaseImpl
import com.wire.kalium.logic.feature.conversation.TypingIndicatorSyncManager
import com.wire.kalium.logic.feature.conversation.folder.SyncConversationFoldersUseCase
import com.wire.kalium.logic.feature.conversation.folder.SyncConversationFoldersUseCaseImpl
import com.wire.kalium.logic.feature.conversation.keyingmaterials.KeyingMaterialsManager
import com.wire.kalium.logic.feature.conversation.keyingmaterials.KeyingMaterialsManagerImpl
import com.wire.kalium.logic.feature.conversation.mls.MLSOneOnOneConversationResolver
Expand Down Expand Up @@ -981,9 +979,6 @@ class UserSessionScope internal constructor(
systemMessageInserter
)

private val syncConversationFolders: SyncConversationFoldersUseCase
get() = SyncConversationFoldersUseCaseImpl(conversationFolderRepository)

private val syncConnections: SyncConnectionsUseCase
get() = SyncConnectionsUseCaseImpl(
connectionRepository = connectionRepository
Expand Down Expand Up @@ -1102,8 +1097,7 @@ class UserSessionScope internal constructor(
syncContacts,
joinExistingMLSConversations,
fetchLegalHoldForSelfUserFromRemoteUseCase,
oneOnOneResolver,
syncConversationFolders
oneOnOneResolver
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,13 @@
*/
package com.wire.kalium.logic.feature.conversation.folder

import com.wire.kalium.logic.StorageFailure
import com.wire.kalium.logic.data.conversation.ConversationFolder
import com.wire.kalium.logic.data.conversation.folders.ConversationFolderRepository
import com.wire.kalium.logic.feature.conversation.folder.GetFavoriteFolderUseCase.Result
import com.wire.kalium.logic.functional.Either
import com.wire.kalium.logic.functional.flatMap
import com.wire.kalium.logic.functional.flatMapLeft
import com.wire.kalium.logic.functional.fold

/**
Expand All @@ -41,9 +45,19 @@ internal class GetFavoriteFolderUseCaseImpl(
) : GetFavoriteFolderUseCase {

override suspend operator fun invoke(): Result {
return conversationFolderRepository.getFavoriteConversationFolder().fold(
{ Result.Failure },
{ Result.Success(it) }
)
return conversationFolderRepository.getFavoriteConversationFolder()
.flatMapLeft {
if (it is StorageFailure.DataNotFound) {
conversationFolderRepository.fetchConversationFolders().flatMap {
conversationFolderRepository.getFavoriteConversationFolder()
}
} else {
Either.Left(it)
}
}
.fold(
{ Result.Failure },
{ Result.Success(it) }
)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,8 @@ internal class SlowSyncManager(
* Useful when a new step is added to Slow Sync, or when we fix some bug in Slow Sync,
* and we'd like to get all users to take advantage of the fix.
*/
const val CURRENT_VERSION = 9
const val CURRENT_VERSION = 8
// because we already had version 9, the next version should be 10

val MIN_RETRY_DELAY = 1.seconds
val MAX_RETRY_DELAY = 10.minutes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import com.wire.kalium.logic.data.event.EventRepository
import com.wire.kalium.logic.data.sync.SlowSyncStep
import com.wire.kalium.logic.feature.connection.SyncConnectionsUseCase
import com.wire.kalium.logic.feature.conversation.SyncConversationsUseCase
import com.wire.kalium.logic.feature.conversation.folder.SyncConversationFoldersUseCase
import com.wire.kalium.logic.feature.conversation.mls.OneOnOneResolver
import com.wire.kalium.logic.feature.featureConfig.SyncFeatureConfigsUseCase
import com.wire.kalium.logic.feature.legalhold.FetchLegalHoldForSelfUserFromRemoteUseCase
Expand Down Expand Up @@ -72,7 +71,6 @@ internal class SlowSyncWorkerImpl(
private val joinMLSConversations: JoinExistingMLSConversationsUseCase,
private val fetchLegalHoldForSelfUserFromRemoteUseCase: FetchLegalHoldForSelfUserFromRemoteUseCase,
private val oneOnOneResolver: OneOnOneResolver,
private val syncConversationFolders: SyncConversationFoldersUseCase,
logger: KaliumLogger = kaliumLogger
) : SlowSyncWorker {

Expand Down Expand Up @@ -104,7 +102,6 @@ internal class SlowSyncWorkerImpl(
.continueWithStep(SlowSyncStep.CONTACTS, syncContacts::invoke)
.continueWithStep(SlowSyncStep.JOINING_MLS_CONVERSATIONS, joinMLSConversations::invoke)
.continueWithStep(SlowSyncStep.RESOLVE_ONE_ON_ONE_PROTOCOLS, oneOnOneResolver::resolveAllOneOnOneConversations)
.continueWithStep(SlowSyncStep.CONVERSATION_FOLDERS, syncConversationFolders::invoke)
.flatMap {
saveLastProcessedEventIdIfNeeded(lastProcessedEventIdToSaveOnSuccess)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package com.wire.kalium.logic.feature.conversation.folder

import com.wire.kalium.logic.CoreFailure
import com.wire.kalium.logic.StorageFailure
import com.wire.kalium.logic.data.conversation.ConversationFolder
import com.wire.kalium.logic.data.conversation.folders.ConversationFolderRepository
import com.wire.kalium.logic.feature.conversation.folder.GetFavoriteFolderUseCase.Result
Expand All @@ -28,6 +29,7 @@ import io.mockative.coEvery
import io.mockative.coVerify
import io.mockative.mock
import io.mockative.once
import io.mockative.twice
import kotlinx.coroutines.test.runTest
import kotlin.test.Test
import kotlin.test.assertEquals
Expand All @@ -53,7 +55,7 @@ class GetFavoriteFolderUseCaseTest {
}

@Test
fun givenFavoriteFolderDoesNotExist_WhenInvoked_ThenReturnFailure() = runTest {
fun givenFavoriteFolderReturnsFailure_WhenInvoked_ThenReturnFailure() = runTest {
val (arrangement, getFavoriteFolderUseCase) = Arrangement()
.withFavoriteFolder(Either.Left(CoreFailure.Unknown(null)))
.arrange()
Expand All @@ -67,6 +69,25 @@ class GetFavoriteFolderUseCaseTest {
}.wasInvoked(exactly = once)
}

@Test
fun givenFavoriteFolderDoesNotExist_WhenInvoked_ThenFetchConversationFoldersIsTriggered() = runTest {
val (arrangement, getFavoriteFolderUseCase) = Arrangement()
.withFavoriteFolder(Either.Left(StorageFailure.DataNotFound))
.withFetchConversationFolders(Either.Right(Unit))
.arrange()

val result = getFavoriteFolderUseCase()

assertIs<Result.Failure>(result)

coVerify {
arrangement.conversationFolderRepository.getFavoriteConversationFolder()
}.wasInvoked(exactly = twice)
coVerify {
arrangement.conversationFolderRepository.fetchConversationFolders()
}.wasInvoked(exactly = once)
}

private class Arrangement {
@Mock
val conversationFolderRepository = mock(ConversationFolderRepository::class)
Expand All @@ -81,6 +102,12 @@ class GetFavoriteFolderUseCaseTest {
}.returns(either)
}

suspend fun withFetchConversationFolders(either: Either<CoreFailure, Unit>) = apply {
coEvery {
conversationFolderRepository.fetchConversationFolders()
}.returns(either)
}

fun arrange(block: Arrangement.() -> Unit = { }) = apply(block).let { this to getFavoriteFolderUseCase }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import com.wire.kalium.logic.data.sync.SlowSyncStep
import com.wire.kalium.logic.data.user.LegalHoldStatus
import com.wire.kalium.logic.feature.connection.SyncConnectionsUseCase
import com.wire.kalium.logic.feature.conversation.SyncConversationsUseCase
import com.wire.kalium.logic.feature.conversation.folder.SyncConversationFoldersUseCase
import com.wire.kalium.logic.feature.conversation.mls.OneOnOneResolver
import com.wire.kalium.logic.feature.featureConfig.SyncFeatureConfigsUseCase
import com.wire.kalium.logic.feature.legalhold.FetchLegalHoldForSelfUserFromRemoteUseCase
Expand Down Expand Up @@ -72,7 +71,6 @@ class SlowSyncWorkerTest {
.withJoinMLSConversationsSuccess()
.withResolveOneOnOneConversationsSuccess()
.withFetchLegalHoldStatusSuccess()
.withSyncFoldersSuccess()
.arrange()

worker.slowSyncStepsFlow(successfullyMigration).collect()
Expand Down Expand Up @@ -410,7 +408,6 @@ class SlowSyncWorkerTest {
.withJoinMLSConversationsSuccess()
.withResolveOneOnOneConversationsSuccess()
.withFetchLegalHoldStatusSuccess()
.withSyncFoldersSuccess()
.arrange()

slowSyncWorker.slowSyncStepsFlow(successfullyMigration).collect()
Expand Down Expand Up @@ -514,9 +511,6 @@ class SlowSyncWorkerTest {
@Mock
val fetchLegalHoldForSelfUserFromRemoteUseCase = mock(FetchLegalHoldForSelfUserFromRemoteUseCase::class)

@Mock
val syncConversationFoldersUseCase = mock(SyncConversationFoldersUseCase::class)

init {
runBlocking {
withLastProcessedEventIdReturning(Either.Right("lastProcessedEventId"))
Expand All @@ -534,8 +528,7 @@ class SlowSyncWorkerTest {
joinMLSConversations = joinMLSConversations,
updateSupportedProtocols = updateSupportedProtocols,
fetchLegalHoldForSelfUserFromRemoteUseCase = fetchLegalHoldForSelfUserFromRemoteUseCase,
oneOnOneResolver = oneOnOneResolver,
syncConversationFolders = syncConversationFoldersUseCase
oneOnOneResolver = oneOnOneResolver
)

suspend fun withSyncSelfUserFailure() = apply {
Expand Down Expand Up @@ -651,12 +644,6 @@ class SlowSyncWorkerTest {
oneOnOneResolver.resolveAllOneOnOneConversations(any())
}.returns(success)
}

suspend fun withSyncFoldersSuccess() = apply {
coEvery {
syncConversationFoldersUseCase.invoke()
}.returns(success)
}
}

private companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,6 @@ DELETE FROM LabeledConversation WHERE conversation_id = ? AND folder_id = ?;

clearFolders:
DELETE FROM ConversationFolder;

clearLabeledConversations:
DELETE FROM LabeledConversation;
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ class ConversationFolderDAOImpl internal constructor(
override suspend fun updateConversationFolders(folderWithConversationsList: List<FolderWithConversationsEntity>) =
withContext(coroutineContext) {
conversationFoldersQueries.transaction {
conversationFoldersQueries.clearLabeledConversations()
conversationFoldersQueries.clearFolders()
folderWithConversationsList.forEach { folderWithConversations ->
conversationFoldersQueries.upsertFolder(
Expand Down

0 comments on commit 3d7c712

Please sign in to comment.