@@ -26,21 +26,62 @@ interface ChatMessageDao {
2626 suspend fun getByClientId (chatIdHex : String , clientIdHex : String ): ChatMessageEntity ?
2727
2828 @Insert(onConflict = OnConflictStrategy .REPLACE )
29- suspend fun upsert (entity : ChatMessageEntity )
29+ suspend fun insert (entity : ChatMessageEntity )
3030
3131 @Insert(onConflict = OnConflictStrategy .REPLACE )
32- suspend fun upsert (entities : List <ChatMessageEntity >)
32+ suspend fun insert (entities : List <ChatMessageEntity >)
33+
34+ @Query(" SELECT pending_client_id_hex FROM chat_messages WHERE chat_id_hex = :chatIdHex AND message_id = :messageId" )
35+ suspend fun getPendingClientId (chatIdHex : String , messageId : Long ): String?
36+
37+ @Transaction
38+ suspend fun upsert (entity : ChatMessageEntity ) {
39+ val existingPendingId = getPendingClientId(entity.chatIdHex, entity.messageId)
40+ val merged = if (existingPendingId != null && entity.pendingClientIdHex == null ) {
41+ entity.copy(pendingClientIdHex = existingPendingId)
42+ } else entity
43+ insert(merged)
44+ }
45+
46+ @Transaction
47+ suspend fun upsert (entities : List <ChatMessageEntity >) {
48+ for (entity in entities) upsert(entity)
49+ }
3350
3451 @Query(" DELETE FROM chat_messages WHERE chat_id_hex = :chatIdHex AND pending_client_id_hex = :clientIdHex" )
3552 suspend fun deletePending (chatIdHex : String , clientIdHex : String )
3653
54+ @Query(" SELECT pending_client_id_hex FROM chat_messages WHERE chat_id_hex = :chatIdHex AND status = 'SENDING' AND pending_client_id_hex IS NOT NULL" )
55+ suspend fun getPendingClientIds (chatIdHex : String ): List <String >
56+
3757 @Query(" DELETE FROM chat_messages WHERE chat_id_hex = :chatIdHex AND status = 'SENDING'" )
3858 suspend fun deleteAllPending (chatIdHex : String )
3959
60+ @Query("""
61+ UPDATE chat_messages
62+ SET message_id = :newMessageId,
63+ timestamp_epoch_ms = :newTimestampMs,
64+ unread_seq = :newUnreadSeq,
65+ status = 'SENT'
66+ WHERE chat_id_hex = :chatIdHex AND pending_client_id_hex = :clientIdHex
67+ """ )
68+ suspend fun updatePendingToConfirmed (
69+ chatIdHex : String ,
70+ clientIdHex : String ,
71+ newMessageId : Long ,
72+ newTimestampMs : Long ,
73+ newUnreadSeq : Long ,
74+ )
75+
4076 @Transaction
4177 suspend fun confirmPendingMessage (chatIdHex : String , clientIdHex : String , serverMessage : ChatMessageEntity ) {
42- deletePending(chatIdHex, clientIdHex)
43- upsert(serverMessage)
78+ updatePendingToConfirmed(
79+ chatIdHex = chatIdHex,
80+ clientIdHex = clientIdHex,
81+ newMessageId = serverMessage.messageId,
82+ newTimestampMs = serverMessage.timestampEpochMs,
83+ newUnreadSeq = serverMessage.unreadSeq,
84+ )
4485 }
4586
4687 @Transaction
0 commit comments