Merge pull request #5678 from element-hq/feature/bma/countAccounts

Introduce new query to count accounts
This commit is contained in:
Benoit Marty 2025-11-04 16:17:10 +01:00 committed by GitHub
commit c800f86b7c
9 changed files with 33 additions and 4 deletions

View file

@ -349,7 +349,7 @@ class RootFlowNode(
} else { } else {
// wait for the current session to be restored // wait for the current session to be restored
val loggedInFlowNode = attachSession(latestSessionId) val loggedInFlowNode = attachSession(latestSessionId)
if (sessionStore.getAllSessions().size > 1) { if (sessionStore.numberOfSessions() > 1) {
// Several accounts, let the user choose which one to use // Several accounts, let the user choose which one to use
backstack.push( backstack.push(
NavTarget.AccountSelect( NavTarget.AccountSelect(
@ -379,7 +379,7 @@ class RootFlowNode(
is PermalinkData.FallbackLink -> Unit is PermalinkData.FallbackLink -> Unit
is PermalinkData.RoomEmailInviteLink -> Unit is PermalinkData.RoomEmailInviteLink -> Unit
else -> { else -> {
if (sessionStore.getAllSessions().size > 1) { if (sessionStore.numberOfSessions() > 1) {
// Several accounts, let the user choose which one to use // Several accounts, let the user choose which one to use
backstack.push( backstack.push(
NavTarget.AccountSelect( NavTarget.AccountSelect(

View file

@ -90,7 +90,7 @@ class OnBoardingPresenter(
} }
val isAddingAccount by produceState(initialValue = false) { val isAddingAccount by produceState(initialValue = false) {
// We are adding an account if there is at least one session already stored // We are adding an account if there is at least one session already stored
value = sessionStore.getAllSessions().isNotEmpty() value = sessionStore.numberOfSessions() > 0
} }
val loginMode by loginHelper.collectLoginMode() val loginMode by loginHelper.collectLoginMode()

View file

@ -165,7 +165,7 @@ class DefaultBugReporter(
} }
} }
val sessionData = sessionStore.getLatestSession() val sessionData = sessionStore.getLatestSession()
val numberOfAccounts = sessionStore.getAllSessions().size val numberOfAccounts = sessionStore.numberOfSessions()
val deviceId = sessionData?.deviceId ?: "undefined" val deviceId = sessionData?.deviceId ?: "undefined"
val userId = sessionData?.userId?.let { UserId(it) } val userId = sessionData?.userId?.let { UserId(it) }
// build the multi part request // build the multi part request

View file

@ -58,9 +58,11 @@ class SignedOutPresenterTest {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.signedOutSession).isEqualTo(aSessionData) assertThat(initialState.signedOutSession).isEqualTo(aSessionData)
assertThat(sessionStore.getAllSessions()).isNotEmpty() assertThat(sessionStore.getAllSessions()).isNotEmpty()
assertThat(sessionStore.numberOfSessions()).isEqualTo(1)
initialState.eventSink(SignedOutEvents.SignInAgain) initialState.eventSink(SignedOutEvents.SignInAgain)
assertThat(awaitItem().signedOutSession).isNull() assertThat(awaitItem().signedOutSession).isNull()
assertThat(sessionStore.getAllSessions()).isEmpty() assertThat(sessionStore.getAllSessions()).isEmpty()
assertThat(sessionStore.numberOfSessions()).isEqualTo(0)
} }
} }
} }

View file

@ -50,6 +50,11 @@ interface SessionStore {
*/ */
suspend fun getAllSessions(): List<SessionData> suspend fun getAllSessions(): List<SessionData>
/**
* Get the number of sessions.
*/
suspend fun numberOfSessions(): Int
/** /**
* Get the latest session, or null if no session exists. * Get the latest session, or null if no session exists.
*/ */

View file

@ -161,6 +161,15 @@ class DatabaseSessionStore(
} }
} }
override suspend fun numberOfSessions(): Int {
return sessionDataMutex.withLock {
database.sessionDataQueries.count()
.executeAsOneOrNull()
?.toInt()
?: 0
}
}
override fun sessionsFlow(): Flow<List<SessionData>> { override fun sessionsFlow(): Flow<List<SessionData>> {
return database.sessionDataQueries.selectAll() return database.sessionDataQueries.selectAll()
.asFlow() .asFlow()

View file

@ -47,6 +47,9 @@ SELECT * FROM SessionData ORDER BY lastUsageIndex DESC LIMIT 1;
selectAll: selectAll:
SELECT * FROM SessionData ORDER BY lastUsageIndex DESC; SELECT * FROM SessionData ORDER BY lastUsageIndex DESC;
count:
SELECT count(*) FROM SessionData;
selectByUserId: selectByUserId:
SELECT * FROM SessionData WHERE userId = ?; SELECT * FROM SessionData WHERE userId = ?;

View file

@ -52,6 +52,7 @@ class DatabaseSessionStoreTest {
assertThat(database.sessionDataQueries.selectLatest().executeAsOneOrNull()).isEqualTo(aSessionData) assertThat(database.sessionDataQueries.selectLatest().executeAsOneOrNull()).isEqualTo(aSessionData)
assertThat(database.sessionDataQueries.selectAll().executeAsList().size).isEqualTo(1) assertThat(database.sessionDataQueries.selectAll().executeAsList().size).isEqualTo(1)
assertThat(database.sessionDataQueries.count().executeAsOneOrNull()).isEqualTo(1)
} }
@Test @Test
@ -109,6 +110,7 @@ class DatabaseSessionStoreTest {
assertThat(foundSession).isEqualTo(aSessionData) assertThat(foundSession).isEqualTo(aSessionData)
assertThat(database.sessionDataQueries.selectAll().executeAsList().size).isEqualTo(2) assertThat(database.sessionDataQueries.selectAll().executeAsList().size).isEqualTo(2)
assertThat(database.sessionDataQueries.count().executeAsOneOrNull()).isEqualTo(2)
} }
@Test @Test
@ -196,12 +198,16 @@ class DatabaseSessionStoreTest {
position = 1, position = 1,
lastUsageIndex = 1, lastUsageIndex = 1,
) )
assertThat(database.sessionDataQueries.count().executeAsOneOrNull()).isEqualTo(1)
databaseSessionStore.addSession(secondSessionData.toApiModel()) databaseSessionStore.addSession(secondSessionData.toApiModel())
assertThat(awaitItem().size).isEqualTo(2) assertThat(awaitItem().size).isEqualTo(2)
assertThat(database.sessionDataQueries.count().executeAsOneOrNull()).isEqualTo(2)
databaseSessionStore.removeSession(aSessionData.userId) databaseSessionStore.removeSession(aSessionData.userId)
assertThat(awaitItem().size).isEqualTo(1) assertThat(awaitItem().size).isEqualTo(1)
assertThat(database.sessionDataQueries.count().executeAsOneOrNull()).isEqualTo(1)
databaseSessionStore.removeSession(secondSessionData.userId) databaseSessionStore.removeSession(secondSessionData.userId)
assertThat(awaitItem()).isEmpty() assertThat(awaitItem()).isEmpty()
assertThat(database.sessionDataQueries.count().executeAsOneOrNull()).isEqualTo(0)
} }
} }

View file

@ -67,6 +67,10 @@ class InMemorySessionStore(
return sessionDataListFlow.value return sessionDataListFlow.value
} }
override suspend fun numberOfSessions(): Int {
return sessionDataListFlow.value.size
}
override suspend fun getLatestSession(): SessionData? { override suspend fun getLatestSession(): SessionData? {
return sessionDataListFlow.value.firstOrNull() return sessionDataListFlow.value.firstOrNull()
} }