Private
Public Access
1
0

Adds Message retrieval

This commit is contained in:
2023-08-09 02:00:52 -07:00
parent 4724ae5728
commit 4fda6428ce
3 changed files with 60 additions and 5 deletions

View File

@@ -3,12 +3,16 @@ package net.buzzert.kordophone.backend.db
import io.realm.kotlin.Realm
import io.realm.kotlin.RealmConfiguration
import net.buzzert.kordophone.backend.db.model.Conversation
import net.buzzert.kordophone.backend.db.model.Message
import net.buzzert.kordophone.backend.db.model.toDatabaseConversation
import net.buzzert.kordophone.backend.db.model.toDatabaseMessage
import net.buzzert.kordophone.backend.model.GUID
import net.buzzert.kordophone.backend.model.Conversation as ModelConversation
import net.buzzert.kordophone.backend.model.Message as ModelMessage
internal class CachedChatDatabase (private val realmConfig: RealmConfiguration) {
companion object {
private val schema = setOf(Conversation::class)
private val schema = setOf(Conversation::class, Message::class)
fun liveDatabase(): CachedChatDatabase {
return CachedChatDatabase(
@@ -43,4 +47,22 @@ internal class CachedChatDatabase (private val realmConfig: RealmConfiguration)
val items = realm.query(Conversation::class).find()
return items.map { it.toConversation() }
}
fun writeMessages(messages: List<ModelMessage>, conversation: ModelConversation) {
val dbConversation = getConversationByGuid(conversation.guid)
realm.writeBlocking {
findLatest(dbConversation)?.messages?.addAll(messages.map { it.toDatabaseMessage() })
}
}
fun fetchMessages(conversation: ModelConversation): List<ModelMessage> {
val dbConversation = getConversationByGuid(conversation.guid)
return dbConversation.messages.map { it.toMessage() }
}
private fun getConversationByGuid(guid: GUID): Conversation {
return realm.query(Conversation::class, "guid == '$guid'")
.find()
.first()
}
}

View File

@@ -24,18 +24,19 @@ open class Conversation(
var lastMessagePreview: String,
var guid: GUID,
// TODO: Not sure how to do this yet...
// var messages: RealmList<Message>,
var messages: RealmList<Message>,
): RealmObject
{
constructor(): this(
_id = ObjectId().toString(),
displayName = null,
participants = realmListOf(),
participants = realmListOf<String>(),
date = RealmInstant.now(),
unreadCount = 0,
lastMessagePreview = "",
guid = "",
messages = realmListOf<Message>()
)
fun toConversation(): ModelConversation {

View File

@@ -2,13 +2,14 @@ package net.buzzert.kordophone.backend
import net.buzzert.kordophone.backend.db.CachedChatDatabase
import net.buzzert.kordophone.backend.model.Conversation
import net.buzzert.kordophone.backend.model.Message
import org.junit.Assert.assertEquals
import org.junit.Test
import java.util.Date
class DatabaseTests {
@Test
fun testCreateRetrieve() {
fun testConversationRetrieval() {
val db = CachedChatDatabase.testDatabase()
val conversation = Conversation(
@@ -28,4 +29,35 @@ class DatabaseTests {
val readConversation = readBackConversations[0]
assertEquals(readConversation, conversation)
}
@Test
fun testMessageRetrieval() {
val db = CachedChatDatabase.testDatabase()
val conversation = Conversation(
date = Date(),
participants = listOf("james@magahern.com"),
displayName = "Test",
unreadCount = 1,
lastMessagePreview = "Hello!",
guid = "1234",
)
db.writeConversations(listOf(conversation))
val message = Message(
text = "Hello!",
guid = "4321",
date = Date(),
sender = "james@magahern.com"
)
db.writeMessages(listOf(message), conversation)
val readMessages = db.fetchMessages(conversation)
assertEquals(readMessages.count(), 1)
val readMessage = readMessages[0]
assertEquals(readMessage, message)
}
}