git » sdk » commit c9f1a37

Refactor meta load

author Stephen Paul Weber
2026-09-23 13:47:25 UTC
committer Stephen Paul Weber
2026-09-23 13:47:25 UTC
parent 5ce80338d365989c1d3b4903dc1b838a1a8c05fe

Refactor meta load

We load reply to, reactions, attachments in many plaes. Do it in one place.

borogove/persistence/Sqlite.hx +47 -50

diff --git a/borogove/persistence/Sqlite.hx b/borogove/persistence/Sqlite.hx
index d6220b9..1a1ae8b 100644
--- a/borogove/persistence/Sqlite.hx
+++ b/borogove/persistence/Sqlite.hx
@@ -781,7 +781,7 @@ class Sqlite implements Persistence implements KeyValueStore {
 			sql += " AND chat_id=?";
 			params.push(chatId);
 		}
-		return db.exec(sql, params).then(result -> hydrateMessages(accountId, result));
+		return db.exec(sql, params).then(result -> hydrateMessagesAndLoadMeta(accountId, result));
 	}
 
 	@HaxeCBridge.noemit
@@ -843,11 +843,7 @@ class Sqlite implements Persistence implements KeyValueStore {
 			insertMessages(accountId, messages).then(_ ->
 				thenshim.PromiseTools.all(messages.map(m -> fetchFromStub(accountId, m)))
 			).then(ms ->
-				thenshim.PromiseTools.all(ms.flatMap(m -> m.attachments.map(a -> a.lookup(this)))).then(_ ->
-					hydrateReplyTo(accountId, ms, replyTos)
-				)
-			).then(ms ->
-				hydrateReactions(accountId, ms)
+				messagesLoadMeta(accountId, ms)
 			)
 		);
 
@@ -915,15 +911,7 @@ class Sqlite implements Persistence implements KeyValueStore {
 			params.push(localId);
 		}
 		q += "LIMIT 1";
-		return db.exec(q, params).then(result -> hydrateMessages(accountId, result)).then(messages ->
-			thenshim.PromiseTools.all(messages.map(message ->
-				(if (message.replyToMessage != null) {
-					hydrateReplyTo(accountId, [message], [{ chatId: chatId, serverId: message.replyToMessage.serverId, localId: message.replyToMessage.localId }]);
-				} else {
-					Promise.resolve([message]);
-				}).then(messages -> hydrateReactions(accountId, messages))
-			)).then(items -> items.flatten()).then(items -> items.length > 0 ? items[0] : null)
-		);
+		return db.exec(q, params).then(result -> hydrateMessagesAndLoadMeta(accountId, result)).then(ms -> ms.length > 0 ? ms[0] : null);
 	}
 
 	private function getMessages(accountId: String, chatId: String, sortId: Null<String>, op: String, useTimestamp: Bool = false, timestamp: Null<String> = null): Promise<Array<ChatMessage>> {
@@ -1019,18 +1007,8 @@ class Sqlite implements Persistence implements KeyValueStore {
 			if (op == "<" || op == "<=") {
 				messages.reverse();
 			}
-			final ps = [];
-			final replyTos = [];
-			for (message in messages) {
-				if (message.replyToMessage != null && message.replyToMessage.stanza == null) {
-					replyTos.push({ chatId: message.chatId(), serverId: message.replyToMessage.serverId, localId: message.replyToMessage.localId });
-				}
-				for (attachment in message.attachments) {
-					ps.push(attachment.lookup(this));
-				}
-			}
-			return thenshim.PromiseTools.all(ps).then(_ -> hydrateReplyTo(accountId, messages, replyTos));
-		}).then(messages -> hydrateReactions(accountId, messages));
+			return messagesLoadMeta(accountId, messages);
+		});
 	}
 
 	@HaxeCBridge.noemit
@@ -1063,20 +1041,7 @@ class Sqlite implements Persistence implements KeyValueStore {
 				ORDER BY created_at
 			',
 			[accountId, status]
-		).then(result -> {
-			final messages = hydrateMessages(accountId, result);
-			final replyTos = [];
-			final attachments = [];
-			for (message in messages) {
-				if (message.replyToMessage != null && message.replyToMessage.stanza == null) {
-					replyTos.push({ chatId: message.chatId(), serverId: message.replyToMessage.serverId, localId: message.replyToMessage.localId });
-				}
-				for (attachment in message.attachments) {
-					attachments.push(attachment.lookup(this));
-				}
-			}
-			return thenshim.PromiseTools.all(attachments).then(_ -> hydrateReplyTo(accountId, messages, replyTos));
-		}).then(messages -> hydrateReactions(accountId, messages));
+		).then(result -> hydrateMessagesAndLoadMeta(accountId, result));
 	}
 
 	private function getChatUnreadDetails(accountId: String, chat: Chat): Promise<{ chatId: String, message: ChatMessage, unreadCount: Int }> {
@@ -1147,16 +1112,9 @@ class Sqlite implements Persistence implements KeyValueStore {
 				',
 				[status, statusText, accountId, localId, MessageSent, MessageDeliveredToDevice, MessageFailedToSend]
 			).then(result ->
-				thenshim.PromiseTools.all(hydrateMessages(accountId, result).map(message ->{
-					return (if (message.replyToMessage != null) {
-						hydrateReplyTo(accountId, [message], [{ chatId: message.chatId(), serverId: message.replyToMessage.serverId, localId: message.replyToMessage.localId }]);
-					} else {
-						Promise.resolve([message]);
-					}).then(messages -> hydrateReactions(accountId, messages));}
-				))
+				hydrateMessagesAndLoadMeta(accountId, result)
 			).then(hydrated -> {
-				final flat = hydrated.flatten();
-				return flat.length > 0 ? Promise.resolve(flat[0]) : Promise.reject("Message not found: " + localId);
+				return hydrated.length > 0 ? Promise.resolve(hydrated[0]) : Promise.reject("Message not found: " + localId);
 			})
 		);
 	}
@@ -1498,6 +1456,45 @@ class Sqlite implements Persistence implements KeyValueStore {
 		);
 	}
 
+	private function hydrateMessagesAndLoadMeta(
+		accountId: String,
+		rows: Iterator<{
+			stanza: String,
+			timestamp: String,
+			direction: MessageDirection,
+			type: MessageType,
+			status: MessageStatus,
+			status_text: Null<String>,
+			mam_id: String,
+			mam_by: String,
+			sort_id: String,
+			sync_point: Int,
+			sender_id: String,
+			encryption: Null<String>,
+			debug: Null<String>,
+			?stanza_id: String,
+			?versions: String
+		}>
+	) {
+		return messagesLoadMeta(accountId, hydrateMessages(accountId, rows));
+	}
+
+	private function messagesLoadMeta(accountId: String, messages: Array<ChatMessage>) {
+		final replyTos = [];
+		final attachments = [];
+		for (message in messages) {
+			if (message.replyToMessage != null && message.replyToMessage.stanza == null) {
+				replyTos.push({ chatId: message.chatId(), serverId: message.replyToMessage.serverId, localId: message.replyToMessage.localId });
+			}
+			for (attachment in message.attachments) {
+				attachments.push(attachment.lookup(this));
+			}
+		}
+		return thenshim.PromiseTools.all(attachments)
+			.then(_ -> hydrateReplyTo(accountId, messages, replyTos))
+			.then(messages -> hydrateReactions(accountId, messages));
+	}
+
 	private function hydrateMessages(
 		accountId: String,
 		rows: Iterator<{