diff --git a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt index 47c3996c4..70af5f12b 100644 --- a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt +++ b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt @@ -42,10 +42,10 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest -import org.junit.Before import org.junit.Rule -import org.junit.Test import org.junit.rules.TemporaryFolder +import kotlin.test.BeforeTest +import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue @@ -70,7 +70,7 @@ class OfflineFirstNewsRepositoryTest { @get:Rule val tmpFolder: TemporaryFolder = TemporaryFolder.builder().assureDeletion().build() - @Before + @BeforeTest fun setup() { niaPreferencesDataSource = NiaPreferencesDataSource( tmpFolder.testUserPreferencesDataStore(testScope), diff --git a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt index 215caeb9b..fef25ea4b 100644 --- a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt +++ b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt @@ -50,9 +50,6 @@ class OfflineFirstTopicsRepositoryTest { private lateinit var synchronizer: Synchronizer - @get:Rule - val tmpFolder: TemporaryFolder = TemporaryFolder.builder().assureDeletion().build() - @BeforeTest fun setup() { topicDao = TestTopicDao() diff --git a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt index be4f12e56..84cec3c03 100644 --- a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt +++ b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt @@ -18,10 +18,11 @@ package com.google.samples.apps.nowinandroid.core.data.repository import com.google.samples.apps.nowinandroid.core.analytics.NoOpAnalyticsHelper import com.google.samples.apps.nowinandroid.core.datastore.NiaPreferencesDataSource -import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferencesDataStore import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.core.model.data.UserData +import com.russhwolf.settings.MapSettings +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.test.TestScope @@ -35,7 +36,12 @@ import kotlin.test.assertTrue class OfflineFirstUserDataRepositoryTest { - private val testScope = TestScope(UnconfinedTestDispatcher()) + @OptIn(ExperimentalCoroutinesApi::class) + private val dispatcher = UnconfinedTestDispatcher() + + private val settings = MapSettings() + + private val testScope = TestScope(dispatcher) private lateinit var subject: OfflineFirstUserDataRepository @@ -43,13 +49,11 @@ class OfflineFirstUserDataRepositoryTest { private val analyticsHelper = NoOpAnalyticsHelper() - @get:Rule - val tmpFolder: TemporaryFolder = TemporaryFolder.builder().assureDeletion().build() - @BeforeTest fun setup() { niaPreferencesDataSource = NiaPreferencesDataSource( - tmpFolder.testUserPreferencesDataStore(testScope), + settings, + dispatcher, ) subject = OfflineFirstUserDataRepository( diff --git a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt index a3e373918..4a2e4a64b 100644 --- a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt +++ b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt @@ -17,6 +17,7 @@ package com.google.samples.apps.nowinandroid.core.data.testdoubles import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceDao +import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceDaoInterface import com.google.samples.apps.nowinandroid.core.database.model.NewsResourceEntity import com.google.samples.apps.nowinandroid.core.database.model.NewsResourceTopicCrossRef import com.google.samples.apps.nowinandroid.core.database.model.PopulatedNewsResource @@ -32,7 +33,7 @@ val nonPresentInterestsIds = setOf("2") /** * Test double for [NewsResourceDao] */ -class TestNewsResourceDao : NewsResourceDao { +class TestNewsResourceDao : NewsResourceDaoInterface { private val entitiesStateFlow = MutableStateFlow(emptyList()) @@ -92,6 +93,10 @@ class TestNewsResourceDao : NewsResourceDao { result.map { it.entity.id } } + override suspend fun insertOrIgnoreNewsResources(entities: List): List { + TODO("Not yet implemented") + } + override suspend fun upsertNewsResources(newsResourceEntities: List) { entitiesStateFlow.update { oldValues -> // New values come first so they overwrite old values diff --git a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt index d217f55d7..438c59f1c 100644 --- a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt +++ b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt @@ -17,6 +17,7 @@ package com.google.samples.apps.nowinandroid.core.data.testdoubles import com.google.samples.apps.nowinandroid.core.database.dao.TopicDao +import com.google.samples.apps.nowinandroid.core.database.dao.TopicDaoInterface import com.google.samples.apps.nowinandroid.core.database.model.TopicEntity import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -26,7 +27,7 @@ import kotlinx.coroutines.flow.update /** * Test double for [TopicDao] */ -class TestTopicDao : TopicDao { +class TestTopicDao : TopicDaoInterface { private val entitiesStateFlow = MutableStateFlow(emptyList()) diff --git a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt index a1b72c52f..3437d0c25 100644 --- a/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt +++ b/core/data/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt @@ -19,7 +19,7 @@ package com.google.samples.apps.nowinandroid.core.database.model import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.Topic import kotlinx.datetime.Instant -import org.junit.Test +import kotlin.test.Test import kotlin.test.assertEquals class PopulatedNewsResourceKtTest { diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt index 73e27ef38..ff16b11cc 100644 --- a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt +++ b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt @@ -30,17 +30,17 @@ import kotlinx.datetime.Instant /** * DAO for [NewsResource] and [NewsResourceEntity] access */ -class NewsResourceDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) { +class NewsResourceDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher): NewsResourceDaoInterface { private val query = db.newsResourceQueries /** * Fetches news resources that match the query parameters */ - fun getNewsResources( - useFilterTopicIds: Boolean = false, - filterTopicIds: Set = emptySet(), - useFilterNewsIds: Boolean = false, - filterNewsIds: Set = emptySet(), + override fun getNewsResources( + useFilterTopicIds: Boolean, + filterTopicIds: Set, + useFilterNewsIds: Boolean, + filterNewsIds: Set, ): Flow> { return query.getNewsResources( useFilterTopicIds = useFilterTopicIds, @@ -69,11 +69,11 @@ class NewsResourceDao(db: NiaDatabase, private val dispatcher: CoroutineDispatch /** * Fetches ids of news resources that match the query parameters */ - fun getNewsResourceIds( - useFilterTopicIds: Boolean = false, - filterTopicIds: Set = emptySet(), - useFilterNewsIds: Boolean = false, - filterNewsIds: Set = emptySet(), + override fun getNewsResourceIds( + useFilterTopicIds: Boolean, + filterTopicIds: Set, + useFilterNewsIds: Boolean, + filterNewsIds: Set, ): Flow> { return query.getNewsResourceIds( useFilterTopicIds = useFilterTopicIds, @@ -88,7 +88,7 @@ class NewsResourceDao(db: NiaDatabase, private val dispatcher: CoroutineDispatch /** * Inserts [entities] into the db if they don't exist, and ignores those that do */ - suspend fun insertOrIgnoreNewsResources(entities: List): List { + override suspend fun insertOrIgnoreNewsResources(entities: List): List { entities.forEach { query.insertOrIgnoreNewsResource( id = it.id, @@ -109,7 +109,7 @@ class NewsResourceDao(db: NiaDatabase, private val dispatcher: CoroutineDispatch /** * Inserts or updates [newsResourceEntities] in the db under the specified primary keys */ - suspend fun upsertNewsResources(newsResourceEntities: List) { + override suspend fun upsertNewsResources(newsResourceEntities: List) { newsResourceEntities.forEach { query.upsertNewsResource( id = it.id, @@ -123,7 +123,7 @@ class NewsResourceDao(db: NiaDatabase, private val dispatcher: CoroutineDispatch } } - suspend fun insertOrIgnoreTopicCrossRefEntities( + override suspend fun insertOrIgnoreTopicCrossRefEntities( newsResourceTopicCrossReferences: List, ) { newsResourceTopicCrossReferences.forEach { @@ -137,7 +137,7 @@ class NewsResourceDao(db: NiaDatabase, private val dispatcher: CoroutineDispatch /** * Deletes rows in the db matching the specified [ids] */ - suspend fun deleteNewsResources(ids: List) { + override suspend fun deleteNewsResources(ids: List) { query.deleteNewsResources(ids) } } diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoInterface.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoInterface.kt new file mode 100644 index 000000000..1dbff1ad0 --- /dev/null +++ b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoInterface.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * 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 + * + * https://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 com.google.samples.apps.nowinandroid.core.database.dao + +import com.google.samples.apps.nowinandroid.core.database.model.NewsResourceEntity +import com.google.samples.apps.nowinandroid.core.database.model.NewsResourceTopicCrossRef +import com.google.samples.apps.nowinandroid.core.database.model.PopulatedNewsResource +import kotlinx.coroutines.flow.Flow + +interface NewsResourceDaoInterface { + fun getNewsResources( + useFilterTopicIds: Boolean = false, + filterTopicIds: Set = emptySet(), + useFilterNewsIds: Boolean = false, + filterNewsIds: Set = emptySet() + ): Flow> + + fun getNewsResourceIds( + useFilterTopicIds: Boolean = false, + filterTopicIds: Set = emptySet(), + useFilterNewsIds: Boolean = false, + filterNewsIds: Set = emptySet() + ): Flow> + + suspend fun insertOrIgnoreNewsResources(entities: List): List + suspend fun upsertNewsResources(newsResourceEntities: List) + suspend fun insertOrIgnoreTopicCrossRefEntities(newsResourceTopicCrossReferences: List) + suspend fun deleteNewsResources(ids: List) +} diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceFtsDao.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceFtsDao.kt index 3f619f8b2..752fa637f 100644 --- a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceFtsDao.kt +++ b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceFtsDao.kt @@ -28,9 +28,9 @@ import kotlinx.coroutines.flow.map /** * DAO for [NewsResourceFtsEntity] access. */ -class NewsResourceFtsDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) { +class NewsResourceFtsDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher): NewsResourceFtsDaoInterface { private val dbQuery = db.newsResourceFtsQueries - suspend fun insertAll(newsResources: List) { + override suspend fun insertAll(newsResources: List) { newsResources.forEach { dbQuery.insert( news_resource_id = it.newsResourceId, @@ -40,13 +40,13 @@ class NewsResourceFtsDao(db: NiaDatabase, private val dispatcher: CoroutineDispa } } - fun searchAllNewsResources(query: String): Flow> { + override fun searchAllNewsResources(query: String): Flow> { return dbQuery.searchAllNewsResources(query) .asFlow() .mapToList(dispatcher) } - fun getCount(): Flow { + override fun getCount(): Flow { return dbQuery.getCount() .asFlow() .mapToOneNotNull(dispatcher) diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceFtsDaoInterface.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceFtsDaoInterface.kt new file mode 100644 index 000000000..58381b11c --- /dev/null +++ b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceFtsDaoInterface.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * 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 + * + * https://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 com.google.samples.apps.nowinandroid.core.database.dao + +import com.google.samples.apps.nowinandroid.core.database.model.NewsResourceFtsEntity +import kotlinx.coroutines.flow.Flow + +interface NewsResourceFtsDaoInterface { + suspend fun insertAll(newsResources: List) + fun searchAllNewsResources(query: String): Flow> + fun getCount(): Flow +} diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/RecentSearchQueryDao.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/RecentSearchQueryDao.kt index 551455f23..692095d9b 100644 --- a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/RecentSearchQueryDao.kt +++ b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/RecentSearchQueryDao.kt @@ -28,11 +28,11 @@ import kotlinx.datetime.Instant /** * DAO for [RecentSearchQueryEntity] access */ -class RecentSearchQueryDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) { +class RecentSearchQueryDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher): RecentSearchQueryDaoInterface { private val query = db.recentSearchQueryQueries - fun getRecentSearchQueryEntities(limit: Int): Flow> { + override fun getRecentSearchQueryEntities(limit: Int): Flow> { return query.getRecentSearchQueryEntities(limit.toLong()) { query, timestamp -> RecentSearchQueryEntity( query = query, @@ -43,7 +43,7 @@ class RecentSearchQueryDao(db: NiaDatabase, private val dispatcher: CoroutineDis .mapToList(dispatcher) } - suspend fun insertOrReplaceRecentSearchQuery(recentSearchQuery: RecentSearchQueryEntity) { + override suspend fun insertOrReplaceRecentSearchQuery(recentSearchQuery: RecentSearchQueryEntity) { query.insertOrReplaceRecentSearchQuery( recent_search_query = Recent_search_query( query = recentSearchQuery.query, @@ -52,7 +52,7 @@ class RecentSearchQueryDao(db: NiaDatabase, private val dispatcher: CoroutineDis ) } - suspend fun clearRecentSearchQueries() { + override suspend fun clearRecentSearchQueries() { query.clearRecentSearchQueries() } } diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/RecentSearchQueryDaoInterface.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/RecentSearchQueryDaoInterface.kt new file mode 100644 index 000000000..c920dfa5c --- /dev/null +++ b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/RecentSearchQueryDaoInterface.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * 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 + * + * https://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 com.google.samples.apps.nowinandroid.core.database.dao + +import com.google.samples.apps.nowinandroid.core.database.model.RecentSearchQueryEntity +import kotlinx.coroutines.flow.Flow + +interface RecentSearchQueryDaoInterface { + fun getRecentSearchQueryEntities(limit: Int): Flow> + suspend fun insertOrReplaceRecentSearchQuery(recentSearchQuery: RecentSearchQueryEntity) + suspend fun clearRecentSearchQueries() +} diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt index 200aa9f1d..c794fff7c 100644 --- a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt +++ b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt @@ -29,11 +29,11 @@ import kotlinx.coroutines.flow.map * DAO for [TopicEntity] access */ -class TopicDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) { +class TopicDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher): TopicDaoInterface { private val query = db.topicsQueries - fun getTopicEntity(topicId: String): Flow { + override fun getTopicEntity(topicId: String): Flow { return query.getTopicEntity(topicId) { id, name, shortDescription, longDescription, url, imageUrl -> TopicEntity( id = id, @@ -48,7 +48,7 @@ class TopicDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) { .mapToOne(dispatcher) } - fun getTopicEntities(): Flow> { + override fun getTopicEntities(): Flow> { return query.getOneOffTopicEntities { id, name, shortDescription, longDescription, url, imageUrl -> TopicEntity( id = id, @@ -63,7 +63,7 @@ class TopicDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) { .mapToList(dispatcher) } - suspend fun getOneOffTopicEntities(): List { + override suspend fun getOneOffTopicEntities(): List { // TODO: Use flow? return query.getOneOffTopicEntities { id, name, shortDescription, longDescription, url, imageUrl -> TopicEntity( @@ -77,7 +77,7 @@ class TopicDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) { }.executeAsList() } - fun getTopicEntities(ids: Set): Flow> { + override fun getTopicEntities(ids: Set): Flow> { return query.getTopicEntities { id, name, shortDescription, longDescription, url, imageUrl -> TopicEntity( id = id, @@ -98,7 +98,7 @@ class TopicDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) { /** * Inserts [topicEntities] into the db if they don't exist, and ignores those that do */ - suspend fun insertOrIgnoreTopics(topicEntities: List): List { + override suspend fun insertOrIgnoreTopics(topicEntities: List): List { topicEntities.map { query.insertOrIgnoreTopic( id = it.id, @@ -116,7 +116,7 @@ class TopicDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) { /** * Inserts or updates [entities] in the db under the specified primary keys */ - suspend fun upsertTopics(entities: List) { + override suspend fun upsertTopics(entities: List) { entities.forEach { query.upsertTopic( id = it.id, @@ -132,7 +132,7 @@ class TopicDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) { /** * Deletes rows in the db matching the specified [ids] */ - suspend fun deleteTopics(ids: List) { + override suspend fun deleteTopics(ids: List) { query.deleteTopics(ids) } } diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/TopicDaoInterface.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/TopicDaoInterface.kt new file mode 100644 index 000000000..84c707fc7 --- /dev/null +++ b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/TopicDaoInterface.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * 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 + * + * https://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 com.google.samples.apps.nowinandroid.core.database.dao + +import com.google.samples.apps.nowinandroid.core.database.model.TopicEntity +import kotlinx.coroutines.flow.Flow + +interface TopicDaoInterface { + fun getTopicEntity(topicId: String): Flow + fun getTopicEntities(): Flow> + suspend fun getOneOffTopicEntities(): List + fun getTopicEntities(ids: Set): Flow> + suspend fun insertOrIgnoreTopics(topicEntities: List): List + suspend fun upsertTopics(entities: List) + suspend fun deleteTopics(ids: List) +} diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/TopicFtsDao.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/TopicFtsDao.kt index 303fd14b0..5165815cd 100644 --- a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/TopicFtsDao.kt +++ b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/TopicFtsDao.kt @@ -28,11 +28,11 @@ import kotlinx.coroutines.flow.map /** * DAO for [TopicFtsEntity] access. */ -class TopicFtsDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) { +class TopicFtsDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher): TopicFtsDaoInterface { private val dbQuery = db.topicFtsQueries - suspend fun insertAll(topics: List) { + override suspend fun insertAll(topics: List) { topics.forEach { dbQuery.insert( topic_id = it.topicId, @@ -43,7 +43,7 @@ class TopicFtsDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) } } - fun searchAllTopics(query: String): Flow> { + override fun searchAllTopics(query: String): Flow> { return dbQuery.searchAllTopics(query) { it.orEmpty() } @@ -51,7 +51,7 @@ class TopicFtsDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) .mapToList(dispatcher) } - fun getCount(): Flow { + override fun getCount(): Flow { return dbQuery.getCount() .asFlow() .mapToOne(dispatcher) diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/TopicFtsDaoInterface.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/TopicFtsDaoInterface.kt new file mode 100644 index 000000000..cac2e6d2d --- /dev/null +++ b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/TopicFtsDaoInterface.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * 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 + * + * https://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 com.google.samples.apps.nowinandroid.core.database.dao + +import com.google.samples.apps.nowinandroid.core.database.model.TopicFtsEntity +import kotlinx.coroutines.flow.Flow + +interface TopicFtsDaoInterface { + suspend fun insertAll(topics: List) + fun searchAllTopics(query: String): Flow> + fun getCount(): Flow +}