| author | Stephen Paul Weber
<singpolyma@singpolyma.net> 2026-05-26 20:41:37 UTC |
| committer | Stephen Paul Weber
<singpolyma@singpolyma.net> 2026-05-26 20:41:37 UTC |
| parent | 2454e96faae52f1cc76fb3314f221158a1a04cef |
| borogove/persistence/Sqlite.hx | +42 | -2 |
diff --git a/borogove/persistence/Sqlite.hx b/borogove/persistence/Sqlite.hx index f9bac0e..63cec72 100644 --- a/borogove/persistence/Sqlite.hx +++ b/borogove/persistence/Sqlite.hx @@ -710,7 +710,9 @@ class Sqlite implements Persistence implements KeyValueStore { ] : Array<Dynamic>); }) ).then(_ -> - hydrateReplyTo(accountId, messages, replyTos) + thenshim.PromiseTools.all(messages.map(m -> fetchFromStub(accountId, m))) + ).then(ms -> + hydrateReplyTo(accountId, ms, replyTos) ).then(ms -> hydrateReactions(accountId, ms) ) @@ -724,6 +726,44 @@ class Sqlite implements Persistence implements KeyValueStore { storeMessages(accountId, [message]); } + private function fetchFromStub(accountId, stub: ChatMessage) { + var q = "SELECT + correction_id AS stanza_id, + versions.stanza, + json_group_object(CASE WHEN versions.mam_id IS NULL OR versions.mam_id='' THEN versions.stanza_id ELSE versions.mam_id END, strftime('%FT%H:%M:%fZ', versions.created_at / 1000.0, 'unixepoch')) AS version_times, + json_group_object(CASE WHEN versions.mam_id IS NULL OR versions.mam_id='' THEN versions.stanza_id ELSE versions.mam_id END, versions.stanza) AS versions, + messages.direction, + messages.type, + messages.status, + messages.status_text, + strftime('%FT%H:%M:%fZ', messages.created_at / 1000.0, 'unixepoch') AS timestamp, + messages.sender_id, + messages.mam_id, + messages.mam_by, + messages.sort_id, + messages.sync_point, + MAX(versions.created_at) + FROM messages INNER JOIN messages versions USING (correction_id, sender_id) WHERE messages.account_id=? AND messages.chat_id=? AND (messages.stanza_id IS NULL OR messages.stanza_id='' OR messages.stanza_id=correction_id)"; + var params = [accountId, stub.chatId()]; + if (stub.versions.length > 0 || stub.serverId == null) { + q += " AND correction_id=? AND sender_id=?"; + params.push(stub.localId); + params.push(stub.senderId); + } else if (stub.serverId != null) { + q += " AND messages.mam_id=? AND messages.mam_by=?"; + params.push(stub.serverId); + params.push(stub.serverIdBy); + } else { + throw "No way to look up this message"; + } + q += " GROUP BY correction_id, CASE WHEN messages.type=? THEN 'call' ELSE messages.sender_id END"; + return db.exec(q, params).then(results -> { + final row = results.next(); + if (row == null) return stub; + return hydrateMessages(accountId, [row].iterator())[0]; + }); + } + /** Get a single message @@ -851,7 +891,7 @@ class Sqlite implements Persistence implements KeyValueStore { } final replyTos = []; for (message in messages) { - if (message.replyToMessage != null && message.replyToMessage.serverIdBy == null) { + if (message.replyToMessage != null && message.replyToMessage.stanza == null) { replyTos.push({ chatId: message.chatId(), serverId: message.replyToMessage.serverId, localId: message.replyToMessage.localId }); } }