feat: Enhance avatar management with detailed logging and error handling
This commit is contained in:
@@ -6,6 +6,10 @@ import kotlinx.coroutines.flow.Flow
|
||||
/**
|
||||
* Entity для кэша аватаров - хранит пути к зашифрованным файлам
|
||||
* Совместимо с desktop версией (AvatarProvider)
|
||||
*
|
||||
* Desktop логика:
|
||||
* - Аватары передаются как attachment в сообщениях (AttachmentType.AVATAR)
|
||||
* - Локальное хранение: SQLite + зашифрованные файлы
|
||||
*/
|
||||
@Entity(
|
||||
tableName = "avatar_cache",
|
||||
@@ -27,35 +31,12 @@ data class AvatarCacheEntity(
|
||||
val timestamp: Long // Unix timestamp
|
||||
)
|
||||
|
||||
/**
|
||||
* Entity для трекинга доставки аватаров
|
||||
* Отслеживает кому уже был отправлен текущий аватар
|
||||
*/
|
||||
@Entity(
|
||||
tableName = "avatar_delivery",
|
||||
indices = [
|
||||
Index(value = ["public_key", "account"], unique = true)
|
||||
]
|
||||
)
|
||||
data class AvatarDeliveryEntity(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
val id: Long = 0,
|
||||
|
||||
@ColumnInfo(name = "public_key")
|
||||
val publicKey: String, // Публичный ключ получателя
|
||||
|
||||
@ColumnInfo(name = "account")
|
||||
val account: String // Публичный ключ отправителя (мой аккаунт)
|
||||
)
|
||||
|
||||
/**
|
||||
* DAO для работы с аватарами
|
||||
*/
|
||||
@Dao
|
||||
interface AvatarDao {
|
||||
|
||||
// ============ Avatar Cache ============
|
||||
|
||||
/**
|
||||
* Получить все аватары пользователя (отсортированные по времени)
|
||||
*/
|
||||
@@ -81,7 +62,7 @@ interface AvatarDao {
|
||||
suspend fun insertAvatar(avatar: AvatarCacheEntity)
|
||||
|
||||
/**
|
||||
* Удалить все аватары пользователя (при смене аватара)
|
||||
* Удалить все аватары пользователя
|
||||
*/
|
||||
@Query("DELETE FROM avatar_cache WHERE public_key = :publicKey")
|
||||
suspend fun deleteAvatars(publicKey: String)
|
||||
@@ -100,30 +81,4 @@ interface AvatarDao {
|
||||
)
|
||||
""")
|
||||
suspend fun deleteOldAvatars(publicKey: String, keepCount: Int = 5)
|
||||
|
||||
// ============ Avatar Delivery ============
|
||||
|
||||
/**
|
||||
* Проверить доставлен ли аватар контакту
|
||||
*/
|
||||
@Query("SELECT COUNT(*) > 0 FROM avatar_delivery WHERE public_key = :publicKey AND account = :account")
|
||||
suspend fun isAvatarDelivered(publicKey: String, account: String): Boolean
|
||||
|
||||
/**
|
||||
* Отметить аватар как доставленный
|
||||
*/
|
||||
@Insert(onConflict = OnConflictStrategy.IGNORE)
|
||||
suspend fun markAvatarDelivered(delivery: AvatarDeliveryEntity)
|
||||
|
||||
/**
|
||||
* Удалить все записи о доставке для аккаунта (при смене аватара)
|
||||
*/
|
||||
@Query("DELETE FROM avatar_delivery WHERE account = :account")
|
||||
suspend fun clearDeliveryForAccount(account: String)
|
||||
|
||||
/**
|
||||
* Получить список контактов, которым доставлен аватар
|
||||
*/
|
||||
@Query("SELECT public_key FROM avatar_delivery WHERE account = :account")
|
||||
suspend fun getDeliveredContacts(account: String): List<String>
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user