From 8e7dfe6f3d875f48e06c28fd29fbed30e89073fd Mon Sep 17 00:00:00 2001 From: Kgothatso Ngako Date: Thu, 23 Apr 2026 16:35:16 +0200 Subject: [PATCH] List who a profile is following if that data is available. --- .../compose/database/dao/ConnectionDao.kt | 9 --------- .../compose/database/dao/ProfileDao.kt | 5 +++-- .../dao/SynchronizeNostrEventRequestDao.kt | 4 ++-- .../model/intermdiate/LocalFollowers.kt | 17 ----------------- .../model/intermdiate/LocalFollowing.kt | 17 ----------------- .../intermdiate/LocalProfileWithFollowing.kt | 2 +- .../repository/DatabaseNostrRepository.kt | 14 ++++++++------ .../compose/repository/NostrRepository.kt | 12 ++++++------ .../ui/view/model/FollowersListViewModel.kt | 2 +- .../ui/view/model/FollowingListViewModel.kt | 2 +- 10 files changed, 22 insertions(+), 62 deletions(-) delete mode 100644 composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalFollowers.kt delete mode 100644 composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalFollowing.kt diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/ConnectionDao.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/ConnectionDao.kt index b1a76d5b..f7781f33 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/ConnectionDao.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/ConnectionDao.kt @@ -1,25 +1,16 @@ package ac.cord.auxiliary.compose.database.dao import ac.cord.auxiliary.compose.database.model.Connection -import ac.cord.auxiliary.compose.database.model.intermdiate.LocalFollowers -import ac.cord.auxiliary.compose.database.model.intermdiate.LocalFollowing import androidx.room.Dao import androidx.room.Insert import androidx.room.Query import androidx.room.Upsert -import kotlinx.coroutines.flow.Flow @Dao interface ConnectionDao { @Query("SELECT * FROM Connection LIMIT :limit") fun getAllConnections(limit: Int = 21): List - @Query("SELECT * FROM Connection WHERE sourcePublicKey = :sourcePublicKey") - fun observePublicKeyFollowing(sourcePublicKey: String): Flow - - @Query("SELECT * FROM Connection WHERE destinationPublicKey = :destinationPublicKey") - fun observePublicKeyFollowers(destinationPublicKey: String): Flow - @Insert suspend fun insertPlaceholderProfile(connection: Connection) diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/ProfileDao.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/ProfileDao.kt index be49be4d..cfa273d3 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/ProfileDao.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/ProfileDao.kt @@ -9,6 +9,7 @@ import androidx.room.Insert import androidx.room.OnConflictStrategy.Companion.IGNORE import androidx.room.Query import androidx.room.Upsert +import kotlinx.coroutines.flow.Flow @Dao interface ProfileDao { @@ -22,10 +23,10 @@ interface ProfileDao { fun getProfileByPublicKey(publicKey: String): Profile? @Query("SELECT * FROM NostrEvent WHERE kind = 0 AND pubKey = :publicKey") - fun observeProfileWithFollowersByPublicKey(publicKey: String): LocalProfileWithFollowers? + fun observeProfileWithFollowersByPublicKey(publicKey: String): Flow @Query("SELECT * FROM NostrEvent WHERE kind = 0 AND pubKey = :publicKey") - fun observeProfileWithFollowingByPublicKey(publicKey: String): LocalProfileWithFollowing? + fun observeProfileWithFollowingByPublicKey(publicKey: String): Flow @Insert suspend fun insertPlaceholderProfile(profile: Profile) diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/SynchronizeNostrEventRequestDao.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/SynchronizeNostrEventRequestDao.kt index 7886e9bd..15b8be31 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/SynchronizeNostrEventRequestDao.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/SynchronizeNostrEventRequestDao.kt @@ -14,8 +14,8 @@ interface SynchronizeNostrEventRequestDao { @Query("SELECT * FROM SynchronizeNostrEventRequest WHERE status = :status AND createdAt > :createdAt") fun observeSynchronizeNostrEventRequestsByStatus(status: String, createdAt: Instant = Clock.System.now()): Flow - @Query("SELECT COUNT(*) FROM SynchronizeNostrEventRequest WHERE purpose = :purpose AND status IN (:status)") - fun observeSynchronizeNostrEventRequestByPurposeAndStatusCount(purpose: String, status: List): Flow + @Query("SELECT COUNT(*) FROM SynchronizeNostrEventRequest WHERE purpose = :purpose AND status IN (:status) AND createdAt > :createdAt") + fun observeSynchronizeNostrEventRequestByPurposeAndStatusCount(purpose: String, status: List, createdAt: Instant = Clock.System.now()): Flow @Upsert fun upsert(synchronizeNostrEventRequest: SynchronizeNostrEventRequest) diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalFollowers.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalFollowers.kt deleted file mode 100644 index 201a7842..00000000 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalFollowers.kt +++ /dev/null @@ -1,17 +0,0 @@ -package ac.cord.auxiliary.compose.database.model.intermdiate - -import ac.cord.auxiliary.compose.database.model.Profile -import ac.cord.auxiliary.compose.database.model.Connection -import androidx.room.Embedded -import androidx.room.Junction -import androidx.room.Relation - -data class LocalFollowers( - @Embedded val connection: Connection, - - @Relation( - parentColumn = "destinationPublicKey", - entityColumn = "publicKey", - ) - val followers: List -) diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalFollowing.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalFollowing.kt deleted file mode 100644 index 7e476c66..00000000 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalFollowing.kt +++ /dev/null @@ -1,17 +0,0 @@ -package ac.cord.auxiliary.compose.database.model.intermdiate - -import ac.cord.auxiliary.compose.database.model.Profile -import ac.cord.auxiliary.compose.database.model.Connection -import androidx.room.Embedded -import androidx.room.Junction -import androidx.room.Relation - -data class LocalFollowing( - @Embedded val connection: Connection, - - @Relation( - parentColumn = "sourcePublicKey", - entityColumn = "publicKey", - ) - val following: List -) diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalProfileWithFollowing.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalProfileWithFollowing.kt index a6659dbd..e1702708 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalProfileWithFollowing.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/intermdiate/LocalProfileWithFollowing.kt @@ -25,5 +25,5 @@ data class LocalProfileWithFollowing( entityColumn = "destinationPublicKey" ) ) - val followers: List + val following: List ) diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/repository/DatabaseNostrRepository.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/repository/DatabaseNostrRepository.kt index 71134d17..51d76eee 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/repository/DatabaseNostrRepository.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/repository/DatabaseNostrRepository.kt @@ -13,9 +13,9 @@ import ac.cord.auxiliary.compose.database.model.UnsignedNostrEvent import ac.cord.auxiliary.compose.database.model.intermdiate.LocalBroadcastNostrEventRequest import ac.cord.auxiliary.compose.database.model.intermdiate.LocalNostrEvent import ac.cord.auxiliary.compose.database.model.intermdiate.LocalAccount -import ac.cord.auxiliary.compose.database.model.intermdiate.LocalFollowers -import ac.cord.auxiliary.compose.database.model.intermdiate.LocalFollowing import ac.cord.auxiliary.compose.database.model.intermdiate.LocalProfile +import ac.cord.auxiliary.compose.database.model.intermdiate.LocalProfileWithFollowers +import ac.cord.auxiliary.compose.database.model.intermdiate.LocalProfileWithFollowing import ac.cord.auxiliary.compose.database.model.typealiases.SynchronizationFilterArray import ac.cord.auxiliary.compose.database.model.types.SynchronizationFilter import ac.cord.auxiliary.compose.nostr.Relays @@ -375,13 +375,15 @@ class DatabaseNostrRepository( return database.profileDao().filterProfiles(searchTerm = searchTerm) } - override suspend fun observeProfileFollowers(publicKey: String): Flow { - return database.connectionDao().observePublicKeyFollowers(publicKey) + + override suspend fun observeProfileWithFollowers(publicKey: String): Flow { + return database.profileDao().observeProfileWithFollowersByPublicKey(publicKey) } - override suspend fun observeProfileFollowing(publicKey: String): Flow { - return database.connectionDao().observePublicKeyFollowing(publicKey) + override suspend fun observeProfileWithFollowing(publicKey: String): Flow { + return database.profileDao().observeProfileWithFollowingByPublicKey(publicKey) } + override suspend fun getRecentSearches(): List { return database.recentSearchDao().getAllRecentSearches() } diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/repository/NostrRepository.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/repository/NostrRepository.kt index 7631cf1a..ee7512a4 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/repository/NostrRepository.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/repository/NostrRepository.kt @@ -10,9 +10,9 @@ import ac.cord.auxiliary.compose.database.model.UnsignedNostrEvent import ac.cord.auxiliary.compose.database.model.intermdiate.LocalBroadcastNostrEventRequest import ac.cord.auxiliary.compose.database.model.intermdiate.LocalNostrEvent import ac.cord.auxiliary.compose.database.model.intermdiate.LocalAccount -import ac.cord.auxiliary.compose.database.model.intermdiate.LocalFollowers -import ac.cord.auxiliary.compose.database.model.intermdiate.LocalFollowing import ac.cord.auxiliary.compose.database.model.intermdiate.LocalProfile +import ac.cord.auxiliary.compose.database.model.intermdiate.LocalProfileWithFollowers +import ac.cord.auxiliary.compose.database.model.intermdiate.LocalProfileWithFollowing import ac.cord.auxiliary.compose.database.model.typealiases.SynchronizationFilterArray import ac.cord.auxiliary.compose.database.model.types.SynchronizationFilter import com.vitorpamplona.quartz.nip01Core.core.HexKey @@ -83,9 +83,9 @@ interface NostrRepository { suspend fun filterProfiles(searchTerm: String): List - suspend fun observeProfileFollowing(publicKey: String): Flow + suspend fun observeProfileWithFollowers(publicKey: String): Flow - suspend fun observeProfileFollowers(publicKey: String): Flow + suspend fun observeProfileWithFollowing(publicKey: String): Flow suspend fun getRecentSearches(): List @@ -196,11 +196,11 @@ interface NostrRepository { TODO("Not yet implemented") } - override suspend fun observeProfileFollowing(publicKey: String): Flow { + override suspend fun observeProfileWithFollowers(publicKey: String): Flow { TODO("Not yet implemented") } - override suspend fun observeProfileFollowers(publicKey: String): Flow { + override suspend fun observeProfileWithFollowing(publicKey: String): Flow { TODO("Not yet implemented") } diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/FollowersListViewModel.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/FollowersListViewModel.kt index f517463a..643b3e03 100755 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/FollowersListViewModel.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/FollowersListViewModel.kt @@ -59,7 +59,7 @@ class FollowersListViewModel( fun observeLocalNostrFeed() { logger.d("observeLocalNostrFeed") viewModelScope.launch(Dispatchers.IO) { - nostrRepository.observeProfileFollowers( + nostrRepository.observeProfileWithFollowers( publicKey ).collect { localFollowers -> followersListUIState = FollowersListUIState.Loaded( diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/FollowingListViewModel.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/FollowingListViewModel.kt index 24a3e1d6..ed3c08aa 100755 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/FollowingListViewModel.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/ui/view/model/FollowingListViewModel.kt @@ -58,7 +58,7 @@ class FollowingListViewModel( fun observeLocalNostrFeed() { logger.d("observeLocalNostrFeed") viewModelScope.launch(Dispatchers.IO) { - nostrRepository.observeProfileFollowing( + nostrRepository.observeProfileWithFollowing( publicKey ).collect { localFollowing -> followingListUIState = FollowingListUIState.Loaded(