From 5ea2a4292d105e275adb0ea9e844f2a0225e784d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 6 Mar 2023 13:08:54 +0100 Subject: [PATCH] Split module `session-storage` into `api` and `impl`. --- app/build.gradle.kts | 1 + libraries/matrix/api/build.gradle.kts | 2 +- .../libraries/matrix/impl/RustMatrixClient.kt | 2 +- .../auth/RustMatrixAuthenticationService.kt | 4 +- .../session-storage/api/build.gradle.kts | 27 ++++++++++++ .../sessionstorage/api/SessionData.kt | 27 ++++++++++++ .../sessionstorage/api}/SessionStore.kt | 5 +-- .../{ => impl}/build.gradle.kts | 3 +- .../impl}/DatabaseSessionStore.kt | 9 ++-- .../sessionstorage/impl/SessionDataMapper.kt | 43 +++++++++++++++++++ .../impl}/di/SessionStorageModule.kt | 4 +- .../libraries/matrix/session/SessionData.sq | 0 .../impl}/DatabaseSessionStoreTests.kt | 8 ++-- .../samples/minimal/InMemorySessionStore.kt | 20 ++++----- settings.gradle.kts | 3 +- 15 files changed, 130 insertions(+), 28 deletions(-) create mode 100644 libraries/session-storage/api/build.gradle.kts create mode 100644 libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionData.kt rename libraries/session-storage/{src/main/kotlin/io/element/android/libraries/sessionstorage => api/src/main/kotlin/io/element/android/libraries/sessionstorage/api}/SessionStore.kt (84%) rename libraries/session-storage/{ => impl}/build.gradle.kts (92%) rename libraries/session-storage/{src/main/kotlin/io/element/android/libraries/sessionstorage => impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl}/DatabaseSessionStore.kt (87%) create mode 100644 libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/SessionDataMapper.kt rename libraries/session-storage/{src/main/kotlin/io/element/android/libraries/sessionstorage => impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl}/di/SessionStorageModule.kt (92%) rename libraries/session-storage/{ => impl}/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq (100%) rename libraries/session-storage/{src/test/kotlin/io/element/android/libraries/sessionstorage => impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl}/DatabaseSessionStoreTests.kt (95%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 80df2d1392..7e5f3f6862 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -200,6 +200,7 @@ dependencies { allFeatures() implementation(projects.libraries.matrix.impl) implementation(projects.libraries.dateformatter.impl) + implementation(projects.libraries.sessionStorage.impl) implementation(projects.tests.uitests) implementation(projects.anvilannotations) anvil(projects.anvilcodegen) diff --git a/libraries/matrix/api/build.gradle.kts b/libraries/matrix/api/build.gradle.kts index 2d8519b2e2..6d622f249e 100644 --- a/libraries/matrix/api/build.gradle.kts +++ b/libraries/matrix/api/build.gradle.kts @@ -39,6 +39,6 @@ dependencies { implementation(projects.libraries.core) implementation("net.java.dev.jna:jna:5.13.0@aar") implementation(libs.serialization.json) - api(projects.libraries.sessionStorage) + api(projects.libraries.sessionStorage.api) implementation(libs.coroutines.core) } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index f02929e9ed..e75dd756a2 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -24,7 +24,7 @@ import io.element.android.libraries.matrix.impl.media.RustMediaResolver import io.element.android.libraries.matrix.impl.room.RustMatrixRoom import io.element.android.libraries.matrix.impl.room.RustRoomSummaryDataSource import io.element.android.libraries.matrix.impl.sync.SlidingSyncObserverProxy -import io.element.android.libraries.sessionstorage.SessionStore +import io.element.android.libraries.sessionstorage.api.SessionStore import io.element.android.libraries.matrix.api.media.MediaResolver import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.RoomSummaryDataSource diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt index a00e787c9f..7a51386d02 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt @@ -27,8 +27,8 @@ import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.impl.RustMatrixClient import io.element.android.libraries.matrix.impl.util.logError -import io.element.android.libraries.matrix.session.SessionData -import io.element.android.libraries.sessionstorage.SessionStore +import io.element.android.libraries.sessionstorage.api.SessionData +import io.element.android.libraries.sessionstorage.api.SessionStore import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow diff --git a/libraries/session-storage/api/build.gradle.kts b/libraries/session-storage/api/build.gradle.kts new file mode 100644 index 0000000000..99fd07fee6 --- /dev/null +++ b/libraries/session-storage/api/build.gradle.kts @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.libraries.sessionstorage.api" +} + +dependencies { + implementation(libs.coroutines.core) +} diff --git a/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionData.kt b/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionData.kt new file mode 100644 index 0000000000..3f79701fd8 --- /dev/null +++ b/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionData.kt @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.sessionstorage.api + +data class SessionData( + val userId: String, + val deviceId: String, + val accessToken: String, + val refreshToken: String?, + val homeserverUrl: String, + val isSoftLogout: Boolean, + val slidingSyncProxy: String? +) diff --git a/libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/SessionStore.kt b/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt similarity index 84% rename from libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/SessionStore.kt rename to libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt index a8cd52df70..de0ec2f727 100644 --- a/libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/SessionStore.kt +++ b/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt @@ -14,14 +14,13 @@ * limitations under the License. */ -package io.element.android.libraries.sessionstorage +package io.element.android.libraries.sessionstorage.api -import io.element.android.libraries.matrix.session.SessionData import kotlinx.coroutines.flow.Flow interface SessionStore { fun isLoggedIn(): Flow - suspend fun storeData(session: SessionData) + suspend fun storeData(sessionData: SessionData) suspend fun getSession(sessionId: String): SessionData? suspend fun getLatestSession(): SessionData? suspend fun removeSession(sessionId: String) diff --git a/libraries/session-storage/build.gradle.kts b/libraries/session-storage/impl/build.gradle.kts similarity index 92% rename from libraries/session-storage/build.gradle.kts rename to libraries/session-storage/impl/build.gradle.kts index 2fd74a4670..b1952b6cc5 100644 --- a/libraries/session-storage/build.gradle.kts +++ b/libraries/session-storage/impl/build.gradle.kts @@ -21,7 +21,7 @@ plugins { } android { - namespace = "io.element.android.libraries.sessionstorage" + namespace = "io.element.android.libraries.sessionstorage.impl" } anvil { @@ -32,6 +32,7 @@ dependencies { implementation(libs.dagger) implementation(projects.libraries.core) implementation(projects.libraries.encryptedDb) + implementation(projects.libraries.sessionStorage.api) implementation(libs.sqldelight.driver.android) implementation(libs.sqlcipher) implementation(libs.sqlite) diff --git a/libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/DatabaseSessionStore.kt b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt similarity index 87% rename from libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/DatabaseSessionStore.kt rename to libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt index d833f06d92..6c32bcd1f3 100644 --- a/libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/DatabaseSessionStore.kt +++ b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt @@ -14,14 +14,15 @@ * limitations under the License. */ -package io.element.android.libraries.sessionstorage +package io.element.android.libraries.sessionstorage.impl import com.squareup.anvil.annotations.ContributesBinding import com.squareup.sqldelight.runtime.coroutines.asFlow import com.squareup.sqldelight.runtime.coroutines.mapToOneOrNull import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.SingleIn -import io.element.android.libraries.matrix.session.SessionData +import io.element.android.libraries.sessionstorage.api.SessionData +import io.element.android.libraries.sessionstorage.api.SessionStore import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject @@ -37,17 +38,19 @@ class DatabaseSessionStore @Inject constructor( } override suspend fun storeData(sessionData: SessionData) { - database.sessionDataQueries.insertSessionData(sessionData) + database.sessionDataQueries.insertSessionData(sessionData.toDbModel()) } override suspend fun getLatestSession(): SessionData? { return database.sessionDataQueries.selectFirst() .executeAsOneOrNull() + ?.toApiModel() } override suspend fun getSession(sessionId: String): SessionData? { return database.sessionDataQueries.selectByUserId(sessionId) .executeAsOneOrNull() + ?.toApiModel() } override suspend fun removeSession(sessionId: String) { diff --git a/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/SessionDataMapper.kt b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/SessionDataMapper.kt new file mode 100644 index 0000000000..627f896381 --- /dev/null +++ b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/SessionDataMapper.kt @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.sessionstorage.impl + +import io.element.android.libraries.sessionstorage.api.SessionData + +internal fun SessionData.toDbModel(): io.element.android.libraries.matrix.session.SessionData { + return io.element.android.libraries.matrix.session.SessionData( + userId = userId, + deviceId = deviceId, + accessToken = accessToken, + refreshToken = refreshToken, + homeserverUrl = homeserverUrl, + isSoftLogout = isSoftLogout, + slidingSyncProxy = slidingSyncProxy, + ) +} + +internal fun io.element.android.libraries.matrix.session.SessionData.toApiModel(): SessionData { + return SessionData( + userId = userId, + deviceId = deviceId, + accessToken = accessToken, + refreshToken = refreshToken, + homeserverUrl = homeserverUrl, + isSoftLogout = isSoftLogout, + slidingSyncProxy = slidingSyncProxy, + ) +} diff --git a/libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/di/SessionStorageModule.kt b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/di/SessionStorageModule.kt similarity index 92% rename from libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/di/SessionStorageModule.kt rename to libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/di/SessionStorageModule.kt index 33cdc50257..b101fc39b4 100644 --- a/libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/di/SessionStorageModule.kt +++ b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/di/SessionStorageModule.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.libraries.sessionstorage.di +package io.element.android.libraries.sessionstorage.impl.di import android.content.Context import com.squareup.anvil.annotations.ContributesTo @@ -23,7 +23,7 @@ import dagger.Provides import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.SingleIn -import io.element.android.libraries.sessionstorage.SessionDatabase +import io.element.android.libraries.sessionstorage.impl.SessionDatabase import io.element.encrypteddb.SqlCipherDriverFactory import io.element.encrypteddb.passphrase.RandomSecretPassphraseProvider diff --git a/libraries/session-storage/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq b/libraries/session-storage/impl/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq similarity index 100% rename from libraries/session-storage/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq rename to libraries/session-storage/impl/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq diff --git a/libraries/session-storage/src/test/kotlin/io/element/android/libraries/sessionstorage/DatabaseSessionStoreTests.kt b/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt similarity index 95% rename from libraries/session-storage/src/test/kotlin/io/element/android/libraries/sessionstorage/DatabaseSessionStoreTests.kt rename to libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt index 56c5e4db16..5bd726609b 100644 --- a/libraries/session-storage/src/test/kotlin/io/element/android/libraries/sessionstorage/DatabaseSessionStoreTests.kt +++ b/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.libraries.sessionstorage +package io.element.android.libraries.sessionstorage.impl import app.cash.turbine.test import com.google.common.truth.Truth.assertThat @@ -55,7 +55,7 @@ class DatabaseSessionStoreTests { fun `storeData persists the SessionData into the DB`() = runTest { assertThat(database.sessionDataQueries.selectFirst().executeAsOneOrNull()).isNull() - databaseSessionStore.storeData(aSessionData) + databaseSessionStore.storeData(aSessionData.toApiModel()) assertThat(database.sessionDataQueries.selectFirst().executeAsOneOrNull()).isEqualTo(aSessionData) } @@ -76,7 +76,7 @@ class DatabaseSessionStoreTests { database.sessionDataQueries.insertSessionData(aSessionData) database.sessionDataQueries.insertSessionData(aSessionData.copy(userId = "otherUserId")) - val latestSession = databaseSessionStore.getLatestSession() + val latestSession = databaseSessionStore.getLatestSession()?.toDbModel() assertThat(latestSession).isEqualTo(aSessionData) } @@ -86,7 +86,7 @@ class DatabaseSessionStoreTests { database.sessionDataQueries.insertSessionData(aSessionData) database.sessionDataQueries.insertSessionData(aSessionData.copy(userId = "otherUserId")) - val foundSession = databaseSessionStore.getSession(aSessionData.userId) + val foundSession = databaseSessionStore.getSession(aSessionData.userId)?.toDbModel() assertThat(foundSession).isEqualTo(aSessionData) } diff --git a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/InMemorySessionStore.kt b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/InMemorySessionStore.kt index f96ea63d72..589e5d8804 100644 --- a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/InMemorySessionStore.kt +++ b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/InMemorySessionStore.kt @@ -16,35 +16,35 @@ package io.element.android.samples.minimal -import io.element.android.libraries.matrix.session.SessionData -import io.element.android.libraries.sessionstorage.SessionStore +import io.element.android.libraries.sessionstorage.api.SessionData +import io.element.android.libraries.sessionstorage.api.SessionStore import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.map class InMemorySessionStore : SessionStore { - private var sessionData = MutableStateFlow(null) + private var sessionDataFlow = MutableStateFlow(null) override fun isLoggedIn(): Flow { - return sessionData.map { it != null } + return sessionDataFlow.map { it != null } } - override suspend fun storeData(session: SessionData) { - sessionData.value = session + override suspend fun storeData(sessionData: SessionData) { + sessionDataFlow.value = sessionData } override suspend fun getSession(sessionId: String): SessionData? { - return sessionData.value.takeIf { it?.userId == sessionId } + return sessionDataFlow.value.takeIf { it?.userId == sessionId } } override suspend fun getLatestSession(): SessionData? { - return sessionData.value + return sessionDataFlow.value } override suspend fun removeSession(sessionId: String) { - if (sessionData.value?.userId == sessionId) { - sessionData.value = null + if (sessionDataFlow.value?.userId == sessionId) { + sessionDataFlow.value = null } } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 928fc5b4a4..10b255748b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -67,4 +67,5 @@ include(":features:template") include(":libraries:androidutils") include(":samples:minimal") include(":libraries:encrypted-db") -include(":libraries:session-storage") +include(":libraries:session-storage:api") +include(":libraries:session-storage:impl")