commonMain.net.folivo.trixnity.client.store.RoomTimelineStore.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of trixnity-client-jvm Show documentation
Show all versions of trixnity-client-jvm Show documentation
Multiplatform Kotlin SDK for matrix-protocol
package net.folivo.trixnity.client.store
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import net.folivo.trixnity.client.MatrixClientConfiguration
import net.folivo.trixnity.client.store.cache.MapDeleteByRoomIdRepositoryObservableCache
import net.folivo.trixnity.client.store.cache.MapRepositoryCoroutinesCacheKey
import net.folivo.trixnity.client.store.cache.MinimalDeleteByRoomIdRepositoryObservableCache
import net.folivo.trixnity.client.store.repository.*
import net.folivo.trixnity.core.model.EventId
import net.folivo.trixnity.core.model.RoomId
import net.folivo.trixnity.core.model.events.m.RelationType
class RoomTimelineStore(
timelineEventRepository: TimelineEventRepository,
timelineEventRelationRepository: TimelineEventRelationRepository,
tm: RepositoryTransactionManager,
config: MatrixClientConfiguration,
storeScope: CoroutineScope,
) : Store {
private val timelineEventCache = MinimalDeleteByRoomIdRepositoryObservableCache(
timelineEventRepository,
tm,
storeScope,
config.cacheExpireDurations.timelineEvent
) { it.roomId }
private val timelineEventRelationCache =
MapDeleteByRoomIdRepositoryObservableCache(
timelineEventRelationRepository,
tm,
storeScope,
config.cacheExpireDurations.timelineEventRelation
) { it.firstKey.roomId }
override suspend fun clearCache() = deleteAll()
override suspend fun deleteAll() {
timelineEventCache.deleteAll()
timelineEventRelationCache.deleteAll()
}
suspend fun deleteByRoomId(roomId: RoomId) {
timelineEventCache.deleteByRoomId(roomId)
timelineEventRelationCache.deleteByRoomId(roomId)
}
fun get(eventId: EventId, roomId: RoomId): Flow =
timelineEventCache.read(TimelineEventKey(eventId, roomId))
suspend fun update(
eventId: EventId,
roomId: RoomId,
persistIntoRepository: Boolean = true,
updater: suspend (oldTimelineEvent: TimelineEvent?) -> TimelineEvent?
) = timelineEventCache.write(
TimelineEventKey(eventId, roomId),
persistIntoRepository,
updater = updater
)
suspend fun addAll(events: List) {
events.forEach { event ->
timelineEventCache.write(TimelineEventKey(event.eventId, event.roomId), event)
}
}
fun getRelations(
relatedEventId: EventId,
roomId: RoomId,
relationType: RelationType,
): Flow