67 lines
1.7 KiB
Kotlin
67 lines
1.7 KiB
Kotlin
package chats.data.local.database
|
|
|
|
import androidx.room.Entity
|
|
import androidx.room.Index
|
|
import androidx.room.PrimaryKey
|
|
import chats.domain.model.MessageStatus
|
|
|
|
/**
|
|
* Entity для хранения сообщений в локальной БД Room
|
|
* Используется для офлайн-режима и Single Source of Truth паттерна
|
|
*/
|
|
@Entity(
|
|
tableName = "messages",
|
|
indices = [
|
|
Index(value = ["chatId", "sequenceId"]),
|
|
Index(value = ["localId"], unique = true),
|
|
Index(value = ["serverId"]),
|
|
Index(value = ["status"])
|
|
]
|
|
)
|
|
data class MessageEntity(
|
|
@PrimaryKey(autoGenerate = false)
|
|
val localId: String, // UUID генерируется на клиенте при создании
|
|
|
|
val serverId: String?, // null для неотправленных сообщений
|
|
|
|
val idempotencyKey: String, // UUID v4 для идемпотентности
|
|
|
|
val chatId: String,
|
|
|
|
val senderId: String,
|
|
|
|
val senderName: String,
|
|
|
|
val senderAvatar: String? = null,
|
|
|
|
val content: String?,
|
|
|
|
val sequenceId: Long,
|
|
|
|
val createdAt: String, // ISO-8601 формат
|
|
|
|
val mediaType: String,
|
|
|
|
val mediaJson: String, // JSON список медиа (для Room)
|
|
|
|
val reactionsJson: String = "{}", // JSON map эмодзи -> count
|
|
|
|
val status: MessageStatus,
|
|
|
|
val isPinned: Boolean = false,
|
|
|
|
val isForwarded: Boolean = false,
|
|
|
|
val forwardedFromName: String? = null,
|
|
|
|
val replyToServerId: String? = null,
|
|
|
|
val errorMessage: String? = null,
|
|
|
|
val retryCount: Int = 0,
|
|
|
|
val createdAtMillis: Long = 0,
|
|
|
|
val updatedAtMillis: Long = 0
|
|
)
|