From 4c9afa42fe8b2dc9db42339cc10418c52b4273ed Mon Sep 17 00:00:00 2001 From: Christomatt Date: Thu, 29 Jan 2026 12:15:13 +0100 Subject: [PATCH] feat: Improve user resolution for chat conversations by handling local domain suffixes and pre-fetching message sender details. --- src/app/api/swarm/chat/conversations/route.ts | 10 +++++ src/app/api/swarm/chat/messages/route.ts | 42 +++++++++++++++++-- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/app/api/swarm/chat/conversations/route.ts b/src/app/api/swarm/chat/conversations/route.ts index 901675d..7e535aa 100644 --- a/src/app/api/swarm/chat/conversations/route.ts +++ b/src/app/api/swarm/chat/conversations/route.ts @@ -61,6 +61,16 @@ export async function GET(request: NextRequest) { where: eq(users.handle, participant2Handle), }); + // If not found, check if it's a local user with a domain suffix + if (!cachedUser && participant2Handle.includes('@')) { + const [handlePart, domainPart] = participant2Handle.split('@'); + if (!domainPart || domainPart === process.env.NEXT_PUBLIC_NODE_DOMAIN) { + cachedUser = await db.query.users.findFirst({ + where: eq(users.handle, handlePart), + }); + } + } + // LAZY LOAD: If remote and not cached, try to fetch it now if (!cachedUser && isRemote) { try { diff --git a/src/app/api/swarm/chat/messages/route.ts b/src/app/api/swarm/chat/messages/route.ts index 00fc4f5..a042879 100644 --- a/src/app/api/swarm/chat/messages/route.ts +++ b/src/app/api/swarm/chat/messages/route.ts @@ -7,7 +7,7 @@ import { NextRequest, NextResponse } from 'next/server'; import { db, chatConversations, chatMessages, users } from '@/db'; -import { eq, desc, and, lt, isNull } from 'drizzle-orm'; +import { eq, desc, and, lt, isNull, sql } from 'drizzle-orm'; import { getSession } from '@/lib/auth'; @@ -56,14 +56,50 @@ export async function GET(request: NextRequest) { limit, }); + + + // Collect all unique sender DIDs/Handles + const senderDids = new Set(); + const senderHandles = new Set(); // Fallback + + messages.forEach(m => { + if (m.senderDid) senderDids.add(m.senderDid); + else if (m.senderHandle) senderHandles.add(m.senderHandle); + }); + + // Fetch users + const usersByDid: Record = {}; + const usersByHandle: Record = {}; + + if (senderDids.size > 0) { + const found = await db.query.users.findMany({ + where: sql`${users.did} IN ${Array.from(senderDids)}` + }); + found.forEach(u => usersByDid[u.did] = u); + } + + // Also fetch local users by handle if needed + if (senderHandles.size > 0) { + const found = await db.query.users.findMany({ + where: sql`${users.handle} IN ${Array.from(senderHandles)}` + }); + found.forEach(u => usersByHandle[u.handle] = u); + } + const messagesMapped = messages.map((msg) => { const isSentByMe = msg.senderHandle === session.user.handle; + // Resolve fresh user data + const user = msg.senderDid ? usersByDid[msg.senderDid] : usersByHandle[msg.senderHandle]; + + const displayName = user?.displayName || msg.senderDisplayName || msg.senderHandle; + const avatarUrl = user?.avatarUrl || msg.senderAvatarUrl; + return { id: msg.id, senderHandle: msg.senderHandle, - senderDisplayName: msg.senderDisplayName, - senderAvatarUrl: msg.senderAvatarUrl, + senderDisplayName: displayName, + senderAvatarUrl: avatarUrl, senderDid: msg.senderDid, content: msg.content, deliveredAt: msg.deliveredAt,