Skip to content

Commit 4267e7f

Browse files
committed
chore: add missing dao methods for pending client id resolve
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 9f1c25d commit 4267e7f

1 file changed

Lines changed: 45 additions & 4 deletions

File tree

  • apps/flipcash/shared/persistence/db/src/main/kotlin/com/flipcash/app/persistence/dao

apps/flipcash/shared/persistence/db/src/main/kotlin/com/flipcash/app/persistence/dao/ChatMessageDao.kt

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)