feat: Implement FCM token handling and dialog cache management; enhance user experience and performance

This commit is contained in:
k1ngsterr1
2026-01-17 05:53:27 +05:00
parent c9724b3bb7
commit 52ffc22763
9 changed files with 333 additions and 65 deletions

View File

@@ -236,13 +236,13 @@ interface MessageDao {
suspend fun getUnreadCountForDialog(account: String, opponentKey: String): Int
/**
* Удалить все сообщения диалога
* Удалить все сообщения диалога (возвращает количество удалённых)
*/
@Query("DELETE FROM messages WHERE account = :account AND dialog_key = :dialogKey")
suspend fun deleteDialog(account: String, dialogKey: String)
suspend fun deleteDialog(account: String, dialogKey: String): Int
/**
* Удалить все сообщения между двумя пользователями
* Удалить все сообщения между двумя пользователями (возвращает количество удалённых)
*/
@Query("""
DELETE FROM messages
@@ -251,7 +251,7 @@ interface MessageDao {
(from_public_key = :user2 AND to_public_key = :user1)
)
""")
suspend fun deleteMessagesBetweenUsers(account: String, user1: String, user2: String)
suspend fun deleteMessagesBetweenUsers(account: String, user1: String, user2: String): Int
/**
* Количество непрочитанных сообщений в диалоге
@@ -294,33 +294,39 @@ interface DialogDao {
/**
* Получить все диалоги отсортированные по последнему сообщению
* Исключает requests (диалоги без исходящих сообщений от нас)
* Исключает пустые диалоги (без сообщений)
*/
@Query("""
SELECT * FROM dialogs
WHERE account = :account
AND i_have_sent = 1
AND last_message_timestamp > 0
ORDER BY last_message_timestamp DESC
""")
fun getDialogsFlow(account: String): Flow<List<DialogEntity>>
/**
* Получить requests - диалоги где нам писали, но мы не отвечали
* Исключает пустые диалоги (без сообщений)
*/
@Query("""
SELECT * FROM dialogs
WHERE account = :account
AND i_have_sent = 0
AND last_message_timestamp > 0
ORDER BY last_message_timestamp DESC
""")
fun getRequestsFlow(account: String): Flow<List<DialogEntity>>
/**
* Получить количество requests
* Исключает пустые диалоги (без сообщений)
*/
@Query("""
SELECT COUNT(*) FROM dialogs
WHERE account = :account
AND i_have_sent = 0
AND last_message_timestamp > 0
""")
fun getRequestsCountFlow(account: String): Flow<Int>
@@ -419,7 +425,7 @@ interface DialogDao {
* 1. Берем последнее сообщение (по timestamp DESC)
* 2. Считаем количество непрочитанных сообщений (from_me = 0 AND read = 0)
* 3. Вычисляем i_have_sent = 1 если есть исходящие сообщения (from_me = 1) - как sended в Архиве
* 4. Обновляем диалог или создаем новый
* 4. Обновляем диалог или создаем новый ТОЛЬКО если есть сообщения!
*/
@Query("""
INSERT OR REPLACE INTO dialogs (
@@ -494,6 +500,12 @@ interface DialogDao {
0
)
END AS i_have_sent
WHERE EXISTS (
SELECT 1 FROM messages
WHERE account = :account
AND ((from_public_key = :opponentKey AND to_public_key = :account)
OR (from_public_key = :account AND to_public_key = :opponentKey))
)
""")
suspend fun updateDialogFromMessages(account: String, opponentKey: String)
}