From 22001a5ec4f26186c5f5109b57bb3cd48986ba17 Mon Sep 17 00:00:00 2001 From: Kgothatso Ngako Date: Mon, 20 Apr 2026 01:13:23 +0200 Subject: [PATCH] Filter what gets shown in search --- .../aux/compose/database/dao/NostrEventDao.kt | 21 ++++++++++++ .../model/types/SynchronizationFilter.kt | 2 ++ .../repository/DatabaseNostrRepository.kt | 34 +++++++++++++++++++ .../aux/compose/repository/NostrRepository.kt | 7 ++++ .../ui/view/model/SearchResultViewModel.kt | 3 +- 5 files changed, 65 insertions(+), 2 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/dao/NostrEventDao.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/dao/NostrEventDao.kt index f1027910..4208c70d 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/dao/NostrEventDao.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/dao/NostrEventDao.kt @@ -6,7 +6,10 @@ import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy.Companion.IGNORE import androidx.room.Query +import androidx.room.RawQuery +import androidx.room.RoomRawQuery import androidx.room.Upsert +import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Kind import kotlinx.coroutines.flow.Flow import kotlin.time.Instant @@ -16,6 +19,24 @@ interface NostrEventDao { @Query("SELECT * FROM NostrEvent WHERE kind in (:kinds) ORDER BY createdAt DESC") fun observeNostrEvents(kinds: Array): Flow> + @Query("SELECT * FROM NostrEvent WHERE content LIKE '%' || :search || '%' AND kind in (:kinds) ORDER BY createdAt DESC") + fun observeFilteredNostrEvents( + kinds: Array, + search: String + ): Flow> + + @Query("SELECT * FROM NostrEvent WHERE kind in (:kinds) AND id in (:ids) ORDER BY createdAt DESC") + fun observeFilteredNostrEvents( + kinds: Array, + ids: Array, + ): Flow> + + @Query("SELECT * FROM NostrEvent WHERE kind in (:kinds) AND pubKey in (:authors) ORDER BY createdAt DESC") + fun observeAuthoredNostrEvents( + kinds: Array, + authors: Array, + ): Flow> + @Query("SELECT * FROM NostrEvent WHERE kind in (:kinds) ORDER BY savedAt DESC") fun getAllNostrEvents(kinds: Array): List diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/types/SynchronizationFilter.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/types/SynchronizationFilter.kt index fd3dc079..1256548a 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/types/SynchronizationFilter.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/types/SynchronizationFilter.kt @@ -1,7 +1,9 @@ package ac.aux.compose.database.model.types +import androidx.sqlite.SQLiteStatement import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Kind +import com.vitorpamplona.quartz.nip01Core.store.sqlite.bindAny import kotlinx.serialization.Serializable import kotlin.time.Instant diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/repository/DatabaseNostrRepository.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/repository/DatabaseNostrRepository.kt index 22e511b7..ea041cee 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/repository/DatabaseNostrRepository.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/repository/DatabaseNostrRepository.kt @@ -15,9 +15,11 @@ import ac.aux.compose.database.model.intermdiate.LocalNostrEvent import ac.aux.compose.database.model.intermdiate.LocalAccount import ac.aux.compose.database.model.intermdiate.LocalProfile import ac.aux.compose.database.model.typealiases.SynchronizationFilterArray +import ac.aux.compose.database.model.types.SynchronizationFilter import ac.aux.compose.nostr.Relays import ac.aux.compose.repository.NostrRepository import ac.aux.compose.repository.RelayRepository +import androidx.room.RoomRawQuery import co.touchlab.kermit.Logger import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent @@ -38,6 +40,7 @@ import com.vitorpamplona.quartz.nip57Zaps.LnZapEvent import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow +import okio.Buffer import kotlin.collections.emptyMap import kotlin.collections.plus import kotlin.time.Clock @@ -324,6 +327,37 @@ class DatabaseNostrRepository( ) } + override suspend fun observeNostrFeed(synchronizationFilter: SynchronizationFilter): Flow> { + + return when { + synchronizationFilter.kinds != null && synchronizationFilter.search != null -> { + database.nostrEventDao().observeFilteredNostrEvents( + kinds = synchronizationFilter.kinds, + search = synchronizationFilter.search + ) + } + synchronizationFilter.kinds != null && synchronizationFilter.ids != null -> { + database.nostrEventDao().observeFilteredNostrEvents( + kinds = synchronizationFilter.kinds, + ids = synchronizationFilter.ids + ) + } + synchronizationFilter.kinds != null && synchronizationFilter.authors != null -> { + database.nostrEventDao().observeAuthoredNostrEvents( + kinds = synchronizationFilter.kinds, + authors = synchronizationFilter.authors + ) + } + else -> { + database.nostrEventDao().observeNostrEvents( + kinds = arrayOf( + TextNoteEvent.KIND, + ) + ) + } + } + } + override suspend fun observeLocalNostrEventById(nostrEventId: String): Flow { return database.nostrEventDao().observeNostrEventById(nostrEventId) } diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/repository/NostrRepository.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/repository/NostrRepository.kt index d1c0714d..7ae808a9 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/repository/NostrRepository.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/repository/NostrRepository.kt @@ -12,6 +12,7 @@ import ac.aux.compose.database.model.intermdiate.LocalNostrEvent import ac.aux.compose.database.model.intermdiate.LocalAccount import ac.aux.compose.database.model.intermdiate.LocalProfile import ac.aux.compose.database.model.typealiases.SynchronizationFilterArray +import ac.aux.compose.database.model.types.SynchronizationFilter import com.vitorpamplona.quartz.nip01Core.core.HexKey import kotlinx.coroutines.flow.Flow @@ -72,6 +73,8 @@ interface NostrRepository { suspend fun observeNostrFeed(): Flow> + suspend fun observeNostrFeed(synchronizationFilter: SynchronizationFilter): Flow> + suspend fun observeLocalNostrEventById(nostrEventId: String): Flow suspend fun searchableProfiles(): List @@ -171,6 +174,10 @@ interface NostrRepository { TODO("Not yet implemented") } + override suspend fun observeNostrFeed(synchronizationFilter: SynchronizationFilter): Flow> { + TODO("Not yet implemented") + } + override suspend fun observeLocalNostrEventById(nostrEventId: String): Flow { TODO("Not yet implemented") } diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/SearchResultViewModel.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/SearchResultViewModel.kt index b0c6d221..87f200b7 100755 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/SearchResultViewModel.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/SearchResultViewModel.kt @@ -148,8 +148,7 @@ class SearchResultViewModel( logger.d("loadSearchResultFeed: $searchQuery") viewModelScope.launch(Dispatchers.IO) { // This is something not taking into consideration the results we are actually looking for... - // TODO: Search local notes using the [synchronizationFilter] - nostrRepository.observeNostrFeed().collect { localNostrEvents -> + nostrRepository.observeNostrFeed(synchronizationFilter).collect { localNostrEvents -> searchResultListUIState = SearchResultListUIState.Loaded( localNostrEvents = localNostrEvents )