Skip to content

Commit 2ee861d

Browse files
committed
chore(fc): explicitly define paged conversations query; filter IN only text and announcements
Signed-off-by: Brandon McAnsh <[email protected]>
1 parent 8d2a18f commit 2ee861d

File tree

4 files changed

+89
-8
lines changed

4 files changed

+89
-8
lines changed

flipchatApp/src/main/kotlin/xyz/flipchat/app/features/chat/list/ChatNode.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import androidx.compose.material.DismissValue
1313
import androidx.compose.material.ExperimentalMaterialApi
1414
import androidx.compose.material.FixedThreshold
1515
import androidx.compose.material.SwipeToDismiss
16-
import androidx.compose.material.Text
1716
import androidx.compose.material.icons.Icons
1817
import androidx.compose.material.icons.automirrored.filled.VolumeOff
1918
import androidx.compose.material.icons.automirrored.filled.VolumeUp
@@ -43,6 +42,7 @@ import kotlinx.coroutines.flow.filter
4342
import xyz.flipchat.app.R
4443
import xyz.flipchat.app.ui.LocalUserManager
4544
import xyz.flipchat.services.domain.model.chat.ConversationWithMembersAndLastMessage
45+
import xyz.flipchat.services.internal.data.mapper.nullIfEmpty
4646

4747
@OptIn(ExperimentalMaterialApi::class)
4848
@Composable

services/flipchat/chat/src/main/kotlin/xyz/flipchat/services/internal/data/mapper/MetadataRoomMapper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@ class MetadataRoomMapper @Inject constructor(
3030
}
3131

3232
internal fun Long.ifZeroOrElse(other: Long, block: (Long) -> Long) = takeIf { it > 0 }?.let(block) ?: other
33-
private fun String?.nullIfEmpty() = if (this?.isEmpty() == true) null else this
33+
fun String?.nullIfEmpty() = if (this?.isEmpty() == true) null else this

services/flipchat/chat/src/main/kotlin/xyz/flipchat/services/internal/db/ConversationDao.kt

Lines changed: 85 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,94 @@ interface ConversationDao {
2828
suspend fun upsertConversations(vararg conversation: Conversation)
2929

3030
@RewriteQueriesToDropUnusedColumns
31+
@Transaction
3132
@Query(
3233
"""
33-
SELECT * FROM conversations
34-
WHERE roomNumber > 0
35-
ORDER BY lastActivity DESC
36-
LIMIT :limit OFFSET :offset
37-
"""
34+
SELECT
35+
-- Conversation fields
36+
c.idBase58 AS idBase58,
37+
c.ownerIdBase58 AS ownerIdBase58,
38+
c.title AS title,
39+
c.imageUri AS imageUri,
40+
c.canMute AS canMute,
41+
c.unreadCount AS unreadCount,
42+
c.hasMoreUnread AS hasMoreUnread,
43+
c.isOpen AS isOpen,
44+
c.roomNumber AS roomNumber,
45+
c.lastActivity AS lastActivity,
46+
47+
-- Last message fields
48+
lm.idBase58 AS lastMessageIdBase58,
49+
lm.dateMillis AS lastMessageDateMillis,
50+
lm.senderIdBase58 AS lastMessageSenderIdBase58,
51+
lm.type AS lastMessageType,
52+
lm.content AS lastMessageContent,
53+
54+
-- Member fields
55+
cm.memberIdBase58 AS memberIdBase58,
56+
cm.memberName AS memberName,
57+
cm.imageUri AS imageUri,
58+
cm.isHost AS isHost,
59+
cm.isMuted AS isMuted,
60+
cm.isFullMember AS isFullMember,
61+
cm.isBlocked AS isBlocked
62+
63+
FROM conversations AS c
64+
65+
-- Join to fetch all members for each conversation
66+
LEFT JOIN members AS cm
67+
ON cm.conversationIdBase58 = c.idBase58
68+
69+
-- Subquery to find the most recent message for each conversation
70+
LEFT JOIN (
71+
SELECT
72+
conversationIdBase58,
73+
MAX(dateMillis) AS maxDateMillis
74+
FROM
75+
messages
76+
77+
GROUP BY
78+
conversationIdBase58
79+
) AS latestMessage
80+
ON
81+
c.idBase58 = latestMessage.conversationIdBase58
82+
83+
-- Subquery to find the most recent message for ordering, filtering by specific types
84+
LEFT JOIN (
85+
SELECT
86+
conversationIdBase58,
87+
MAX(dateMillis) AS maxDateMillis
88+
FROM
89+
messages
90+
WHERE
91+
type IN (1, 8)
92+
GROUP BY
93+
conversationIdBase58
94+
) AS messageForOrder
95+
ON
96+
c.idBase58 = messageForOrder.conversationIdBase58
97+
98+
-- Join to get details for the latest message
99+
LEFT JOIN messages AS lm
100+
ON
101+
latestMessage.conversationIdBase58 = lm.conversationIdBase58
102+
AND latestMessage.maxDateMillis = lm.dateMillis
103+
WHERE type IN (1,8)
104+
105+
GROUP BY c.idBase58
106+
107+
ORDER BY
108+
messageForOrder.maxDateMillis DESC
109+
110+
LIMIT :limit OFFSET :offset
111+
"""
38112
)
39-
suspend fun getPagedConversations(limit: Int, offset: Int): List<ConversationWithMembersAndLastMessage>
113+
suspend fun getPagedConversations(
114+
limit: Int,
115+
offset: Int
116+
): List<ConversationWithMembersAndLastMessage>
117+
118+
40119

41120
@RewriteQueriesToDropUnusedColumns
42121
@Transaction

services/flipchat/chat/src/main/kotlin/xyz/flipchat/services/internal/db/ConversationMessageDao.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ interface ConversationMessageDao {
7070
return getNewestMessage(conversationId.base58)
7171
}
7272

73+
@RewriteQueriesToDropUnusedColumns
74+
@Transaction
7375
@Query(
7476
"""
7577
SELECT

0 commit comments

Comments
 (0)