fix: seed DM read states for federated users on first access
When a federated user first accesses DMs on a remote instance, all channels appear unread because no read_states rows exist. Seed missing read states to the latest message during the ready payload build. The S2S relay keeps things in sync going forward.
This commit is contained in:
@@ -1220,6 +1220,33 @@ function buildReadyPayload(userId: string): {
|
|||||||
visibleChannelIdSet.add(dm.id);
|
visibleChannelIdSet.add(dm.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Seed read states for federated users' DM channels that have no existing read state.
|
||||||
|
// This handles the bootstrap: DMs existed before cross-instance access was enabled,
|
||||||
|
// so the remote instance has no read state history. Mark as read (latest message).
|
||||||
|
// Going forward, the S2S read_state_update relay keeps things in sync.
|
||||||
|
if (isFederated && dmChannels.length > 0) {
|
||||||
|
const dmIds = dmChannels.map(dm => dm.id);
|
||||||
|
const existingDmReadStates = batchInArray(
|
||||||
|
dmIds,
|
||||||
|
ids => db.select({ channelId: schema.readStates.channelId })
|
||||||
|
.from(schema.readStates)
|
||||||
|
.where(and(eq(schema.readStates.userId, userId), inArray(schema.readStates.channelId, ids)))
|
||||||
|
.all(),
|
||||||
|
);
|
||||||
|
const hasReadState = new Set(existingDmReadStates.map(rs => rs.channelId));
|
||||||
|
const now = Date.now();
|
||||||
|
for (const dm of dmChannels) {
|
||||||
|
if (!hasReadState.has(dm.id) && dm.lastMessage) {
|
||||||
|
db.insert(schema.readStates).values({
|
||||||
|
userId,
|
||||||
|
channelId: dm.id,
|
||||||
|
lastReadMessageId: dm.lastMessage.id,
|
||||||
|
updatedAt: now,
|
||||||
|
}).run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Get Space Folders
|
// Get Space Folders
|
||||||
const folderRows = db.select()
|
const folderRows = db.select()
|
||||||
.from(schema.spaceFolders)
|
.from(schema.spaceFolders)
|
||||||
|
|||||||
Reference in New Issue
Block a user