Messages.kt
package chat.rocket.android.db.model
import androidx.room.Embedded
import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.PrimaryKey
import androidx.room.Relation
interface BaseMessageEntity
@Entity(
tableName = "messages",
foreignKeys = [
ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["senderId"]),
ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["editedBy"])
]
)
data class MessageEntity(
@PrimaryKey val id: String,
val roomId: String,
val message: String,
val timestamp: Long,
val senderId: String?,
val updatedAt: Long?,
val editedAt: Long?,
val editedBy: String?,
val senderAlias: String?,
val avatar: String?,
val type: String?,
val groupable: Boolean = false,
val parseUrls: Boolean = false,
val pinned: Boolean = false,
val role: String?,
val synced: Boolean = true,
val unread: Boolean? = null
) : BaseMessageEntity
@Entity(
tableName = "message_favorites",
primaryKeys = ["messageId", "userId"],
foreignKeys = [
ForeignKey(
entity = MessageEntity::class, parentColumns = ["id"],
childColumns = ["messageId"], onDelete = ForeignKey.CASCADE
),
ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["userId"])
]
)
data class MessageFavoritesRelation(
val messageId: String,
val userId: String
) : BaseMessageEntity
@Entity(
tableName = "message_mentions",
primaryKeys = ["messageId", "userId"],
foreignKeys = [
ForeignKey(
entity = MessageEntity::class, parentColumns = ["id"],
childColumns = ["messageId"], onDelete = ForeignKey.CASCADE
),
ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["userId"])
]
)
data class MessageMentionsRelation(
val messageId: String,
val userId: String
) : BaseMessageEntity
@Entity(
tableName = "message_channels",
primaryKeys = ["messageId", "roomId"],
foreignKeys = [
ForeignKey(
entity = MessageEntity::class, parentColumns = ["id"],
childColumns = ["messageId"], onDelete = ForeignKey.CASCADE
)
]
)
data class MessageChannels(
val messageId: String,
val roomId: String,
val roomName: String?
) : BaseMessageEntity
@Entity(tableName = "messages_sync")
data class MessagesSync(
@PrimaryKey val roomId: String,
val timestamp: Long
)
data class PartialMessage(
@Embedded val message: MessageEntity,
val senderName: String?,
val senderUsername: String?,
val editName: String?,
val editUsername: String?
) {
@Relation(parentColumn = "id", entityColumn = "messageId")
var urls: List<UrlEntity>? = null
@Relation(parentColumn = "id", entityColumn = "message_id")
var attachments: List<AttachmentEntity>? = null
@Relation(parentColumn = "id", entityColumn = "messageId")
var reactions: List<ReactionEntity>? = null
@Relation(parentColumn = "id", entityColumn = "messageId")
var channels: List<MessageChannels>? = null
override fun toString(): String {
return "PartialMessage(message=$message, senderName=$senderName, senderUsername=$senderUsername, editName=$editName, editUsername=$editUsername, urls=$urls, attachments=$attachments, reactions=$reactions, channels=$channels)"
}
}
data class FullMessage(
val message: PartialMessage,
val favorites: List<UserEntity>,
val mentions: List<UserEntity>
)