Skip to content

Commit

Permalink
feat(ImproveMyKSuite): Only fetch the data if the user has a kSuite
Browse files Browse the repository at this point in the history
  • Loading branch information
FabianDevel committed Mar 6, 2025
1 parent dcafc65 commit dcff1a7
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ class MailboxController @Inject constructor(
return getLockedMailboxesQuery(userId, mailboxInfoRealm).toMailboxesFlow()
}

fun getMyKSuiteMailboxCount(userId: Int): Long {
return getMyKSuiteMailboxesQuery(userId, mailboxInfoRealm).count().find()
}

private fun RealmQuery<Mailbox>.toMailboxesFlow() = asFlow().map { it.list }
//endregion

Expand Down Expand Up @@ -155,6 +159,7 @@ class MailboxController @Inject constructor(
private val isValidInLdap = "${Mailbox.isValidInLdapPropertyName} == true"
private val isLocked = "${Mailbox.isLockedPropertyName} == true"
private val hasValidPassword = "${Mailbox::hasValidPassword.name} == true"
private val isMyKSuite = "${Mailbox::isFree.name} == true"

private fun getMailboxesQuery(
userId: Int? = null,
Expand Down Expand Up @@ -203,6 +208,10 @@ class MailboxController @Inject constructor(
private fun getLockedMailboxesQuery(userId: Int, realm: TypedRealm): RealmQuery<Mailbox> {
return realm.query("${checkHasUserId(userId)} AND ($isLocked OR NOT $isValidInLdap)")
}

private fun getMyKSuiteMailboxesQuery(userId: Int, realm: TypedRealm): RealmQuery<Mailbox> {
return realm.query<Mailbox>("${checkHasUserId(userId)} AND $isMyKSuite")
}
//endregion

//region Get data
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/infomaniak/mail/ui/MainViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ class MainViewModel @Inject constructor(
AccountUtils.updateCurrentUser()

// Refresh My kSuite asynchronously, because it's not required for the threads list display
launch { MyKSuiteDataUtils.fetchData() }
launch { MyKSuiteDataUtils.fetchDataIfMyKSuite(mailboxController) }

// Refresh Mailboxes
SentryLog.d(TAG, "Refresh mailboxes from remote")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,20 +24,18 @@ import com.infomaniak.lib.core.utils.SingleLiveEvent
import com.infomaniak.mail.data.cache.mailboxInfo.MailboxController
import com.infomaniak.mail.data.models.mailbox.Mailbox
import com.infomaniak.mail.di.IoDispatcher
import com.infomaniak.mail.di.MailboxInfoRealm
import com.infomaniak.mail.utils.AccountUtils
import com.infomaniak.mail.utils.MyKSuiteDataUtils
import com.infomaniak.mail.utils.coroutineContext
import dagger.hilt.android.lifecycle.HiltViewModel
import io.realm.kotlin.Realm
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class MykSuiteViewModel @Inject constructor(
@MailboxInfoRealm private val mailboxInfoRealm: Realm,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
private val mailboxController: MailboxController,
) : ViewModel() {

private val ioCoroutineContext = viewModelScope.coroutineContext(ioDispatcher)
Expand All @@ -46,16 +44,10 @@ class MykSuiteViewModel @Inject constructor(
val myKSuiteDataResult = SingleLiveEvent<MyKSuiteData?>()

fun getMyKSuiteMailbox(mailboxId: Int) = viewModelScope.launch {
myKSuiteMailboxResult.postValue(
MailboxController.getMailbox(
userId = AccountUtils.currentUserId,
mailboxId = mailboxId,
realm = mailboxInfoRealm,
)
)
myKSuiteMailboxResult.postValue(mailboxController.getMailbox(userId = AccountUtils.currentUserId, mailboxId = mailboxId))
}

fun refreshMyKSuite() = viewModelScope.launch(ioCoroutineContext) {
myKSuiteDataResult.postValue(MyKSuiteDataUtils.fetchData())
myKSuiteDataResult.postValue(MyKSuiteDataUtils.fetchDataIfMyKSuite(mailboxController))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import com.infomaniak.mail.data.cache.mailboxInfo.MailboxController
import com.infomaniak.mail.data.models.AppSettings
import com.infomaniak.mail.di.IoDispatcher
import com.infomaniak.mail.utils.AccountUtils
import com.infomaniak.mail.utils.MyKSuiteDataUtils
import com.infomaniak.mail.utils.extensions.appContext
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CoroutineDispatcher
Expand All @@ -51,6 +52,7 @@ class SwitchUserViewModel @Inject constructor(
if (user.id != AccountUtils.currentUserId) {
appContext.trackAccountEvent("switch")
RealmDatabase.backupPreviousRealms()
MyKSuiteDataUtils.myKSuite = null
AccountUtils.currentUser = user
AccountUtils.currentMailboxId = mailboxController.getFirstValidMailbox(user.id)?.mailboxId ?: AppSettings.DEFAULT_ID
AccountUtils.reloadApp?.invoke()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import com.infomaniak.core.myksuite.ui.data.MyKSuiteDataManager
import com.infomaniak.lib.core.networking.HttpClient
import com.infomaniak.lib.core.utils.SentryLog
import com.infomaniak.mail.data.api.ApiRepository
import com.infomaniak.mail.data.cache.mailboxInfo.MailboxController
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.MissingFieldException
import kotlin.coroutines.cancellation.CancellationException
Expand All @@ -34,6 +35,8 @@ object MyKSuiteDataUtils : MyKSuiteDataManager() {

override var myKSuite: MyKSuiteData? = null

/** Only call this if you are sure that you want to do the call without checking if it's necessary or not
* To avoid useless call for account that does not have a my kSuite offer, use [fetchDataIfMyKSuite] */
override suspend fun fetchData(): MyKSuiteData? = runCatching {
MyKSuiteDataUtils.requestKSuiteData()
val apiResponse = ApiRepository.getMyKSuiteData(HttpClient.okHttpClient)
Expand All @@ -52,4 +55,9 @@ object MyKSuiteDataUtils : MyKSuiteDataManager() {
SentryLog.d(TAG, "Exception during myKSuite data fetch", exception)
null
}

suspend fun fetchDataIfMyKSuite(mailboxController: MailboxController): MyKSuiteData? {
// Only fetch the my kSuite Data if the current account has a my kSuite
return if (mailboxController.getMyKSuiteMailboxCount(userId = AccountUtils.currentUserId) != 0L) fetchData() else null
}
}

0 comments on commit dcff1a7

Please sign in to comment.