diff --git a/ts/data/data.ts b/ts/data/data.ts index df4c54d4f..e425f4202 100644 --- a/ts/data/data.ts +++ b/ts/data/data.ts @@ -345,6 +345,17 @@ async function getUnreadByConversation( return new MessageCollection(messages); } +async function getDisappearingUnreadByConversation( + conversationId: string, + sentBeforeTimestamp: number +): Promise { + const messages = await channels.getDisappearingUnreadByConversation( + conversationId, + sentBeforeTimestamp + ); + return new MessageCollection(messages); +} + async function markAllAsReadByConversationNoExpiration( conversationId: string, returnMessagesUpdated: boolean // for performance reason we do not return them because usually they are not needed @@ -795,6 +806,7 @@ export const Data = { getMessageByServerId, filterAlreadyFetchedOpengroupMessage, getUnreadByConversation, + getDisappearingUnreadByConversation, getUnreadCountByConversation, markAllAsReadByConversationNoExpiration, getMessageCountByType, diff --git a/ts/data/dataInit.ts b/ts/data/dataInit.ts index 74c479706..9dd65c9a4 100644 --- a/ts/data/dataInit.ts +++ b/ts/data/dataInit.ts @@ -42,6 +42,7 @@ const channelsToMake = new Set([ 'removeMessage', 'removeMessagesByIds', 'getUnreadByConversation', + 'getDisappearingUnreadByConversation', 'markAllAsReadByConversationNoExpiration', 'getUnreadCountByConversation', 'getMessageCountByType', diff --git a/ts/node/sql.ts b/ts/node/sql.ts index b59526c99..235602d8b 100644 --- a/ts/node/sql.ts +++ b/ts/node/sql.ts @@ -1143,6 +1143,24 @@ function getUnreadByConversation(conversationId: string, sentBeforeTimestamp: nu return map(rows, row => jsonToObject(row.json)); } +function getDisappearingUnreadByConversation(conversationId: string, sentBeforeTimestamp: number) { + const rows = assertGlobalInstance() + .prepare( + `SELECT * FROM ${MESSAGES_TABLE} WHERE + unread = $unread AND expireTimer > 0 AND + conversationId = $conversationId AND + COALESCE(serverTimestamp, sent_at) <= $sentBeforeTimestamp + ${orderByClauseASC};` + ) + .all({ + unread: toSqliteBoolean(true), + conversationId, + sentBeforeTimestamp, + }); + + return map(rows, row => jsonToObject(row.json)); +} + /** * Warning: This does not start expiration timer */ @@ -2383,6 +2401,7 @@ export const sqlNode = { removeMessagesByIds, removeAllMessagesInConversation, getUnreadByConversation, + getDisappearingUnreadByConversation, markAllAsReadByConversationNoExpiration, getUnreadCountByConversation, getMessageCountByType, diff --git a/ts/receiver/configMessage.ts b/ts/receiver/configMessage.ts index 3558351e8..8b6b07e41 100644 --- a/ts/receiver/configMessage.ts +++ b/ts/receiver/configMessage.ts @@ -698,7 +698,10 @@ async function applyConvoVolatileUpdateFromWrapper( foundConvo.get('expirationMode') === 'legacy') && foundConvo.get('expireTimer') > 0 ) { - const messages2Expire = await Data.getUnreadByConversation(convoId, lastReadMessageTimestamp); + const messages2Expire = await Data.getDisappearingUnreadByConversation( + convoId, + lastReadMessageTimestamp + ); if (messages2Expire.length) { const messageHashes = compact(