45 lines
1.4 KiB
Kotlin
45 lines
1.4 KiB
Kotlin
package core.database.data
|
|
|
|
import androidx.room.*
|
|
import kotlinx.coroutines.flow.Flow
|
|
|
|
@Entity(tableName = "messages")
|
|
data class MessageEntity(
|
|
@PrimaryKey val id: String,
|
|
val chatId: String,
|
|
val senderId: String,
|
|
val senderName: String,
|
|
val senderAvatar: String?,
|
|
val content: String?,
|
|
val sequenceId: Int,
|
|
val createdAt: String,
|
|
val mediaType: String,
|
|
val mediaJson: String, // Simplified for now
|
|
val reactionsJson: String,
|
|
val isRead: Boolean,
|
|
val replyToId: String? = null
|
|
)
|
|
|
|
@Dao
|
|
interface MessageDao {
|
|
@Query("SELECT * FROM messages WHERE chatId = :chatId ORDER BY sequenceId ASC")
|
|
fun getMessages(chatId: String): Flow<List<MessageEntity>>
|
|
|
|
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
|
suspend fun insertMessages(messages: List<MessageEntity>)
|
|
|
|
@Query("DELETE FROM messages WHERE chatId = :chatId")
|
|
suspend fun clearChat(chatId: String)
|
|
|
|
@Query("DELETE FROM messages WHERE id = :messageId")
|
|
suspend fun deleteMessage(messageId: String)
|
|
|
|
@Query("UPDATE messages SET isRead = 1 WHERE chatId = :chatId AND sequenceId <= :lastReadSequenceId AND isRead = 0")
|
|
suspend fun markMessagesAsRead(chatId: String, lastReadSequenceId: Int)
|
|
}
|
|
|
|
@Database(entities = [MessageEntity::class], version = 1)
|
|
abstract class ChatDatabase : RoomDatabase() {
|
|
abstract fun messageDao(): MessageDao
|
|
}
|