Files
mobile-android/app/src/main/java/com/rosetta/messenger/database/AvatarEntities.kt

85 lines
2.7 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.rosetta.messenger.database
import androidx.room.*
import kotlinx.coroutines.flow.Flow
/**
* Entity для кэша аватаров - хранит пути к зашифрованным файлам
* Совместимо с desktop версией (AvatarProvider)
*
* Desktop логика:
* - Аватары передаются как attachment в сообщениях (AttachmentType.AVATAR)
* - Локальное хранение: SQLite + зашифрованные файлы
*/
@Entity(
tableName = "avatar_cache",
indices = [
Index(value = ["public_key", "timestamp"])
]
)
data class AvatarCacheEntity(
@PrimaryKey(autoGenerate = true)
val id: Long = 0,
@ColumnInfo(name = "public_key")
val publicKey: String,
@ColumnInfo(name = "avatar")
val avatar: String, // Путь к файлу (формат: "a/md5hash")
@ColumnInfo(name = "timestamp")
val timestamp: Long // Unix timestamp
)
/**
* DAO для работы с аватарами
*/
@Dao
interface AvatarDao {
/**
* Получить все аватары пользователя (отсортированные по времени)
*/
@Query("SELECT * FROM avatar_cache WHERE public_key = :publicKey ORDER BY timestamp DESC")
fun getAvatars(publicKey: String): Flow<List<AvatarCacheEntity>>
/**
* Получить последний аватар пользователя
*/
@Query("SELECT * FROM avatar_cache WHERE public_key = :publicKey ORDER BY timestamp DESC LIMIT 1")
suspend fun getLatestAvatar(publicKey: String): AvatarCacheEntity?
/**
* Получить последний аватар пользователя как Flow
*/
@Query("SELECT * FROM avatar_cache WHERE public_key = :publicKey ORDER BY timestamp DESC LIMIT 1")
fun getLatestAvatarFlow(publicKey: String): Flow<AvatarCacheEntity?>
/**
* Сохранить новый аватар
*/
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertAvatar(avatar: AvatarCacheEntity)
/**
* Удалить все аватары пользователя
*/
@Query("DELETE FROM avatar_cache WHERE public_key = :publicKey")
suspend fun deleteAvatars(publicKey: String)
/**
* Удалить старые аватары (оставить только N последних)
*/
@Query("""
DELETE FROM avatar_cache
WHERE public_key = :publicKey
AND id NOT IN (
SELECT id FROM avatar_cache
WHERE public_key = :publicKey
ORDER BY timestamp DESC
LIMIT :keepCount
)
""")
suspend fun deleteOldAvatars(publicKey: String, keepCount: Int = 5)
}