feat: Improve user resolution for chat conversations by handling local domain suffixes and pre-fetching message sender details.
This commit is contained in:
@@ -61,6 +61,16 @@ export async function GET(request: NextRequest) {
|
|||||||
where: eq(users.handle, participant2Handle),
|
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
|
// LAZY LOAD: If remote and not cached, try to fetch it now
|
||||||
if (!cachedUser && isRemote) {
|
if (!cachedUser && isRemote) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
import { NextRequest, NextResponse } from 'next/server';
|
import { NextRequest, NextResponse } from 'next/server';
|
||||||
import { db, chatConversations, chatMessages, users } from '@/db';
|
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';
|
import { getSession } from '@/lib/auth';
|
||||||
|
|
||||||
|
|
||||||
@@ -56,14 +56,50 @@ export async function GET(request: NextRequest) {
|
|||||||
limit,
|
limit,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Collect all unique sender DIDs/Handles
|
||||||
|
const senderDids = new Set<string>();
|
||||||
|
const senderHandles = new Set<string>(); // Fallback
|
||||||
|
|
||||||
|
messages.forEach(m => {
|
||||||
|
if (m.senderDid) senderDids.add(m.senderDid);
|
||||||
|
else if (m.senderHandle) senderHandles.add(m.senderHandle);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Fetch users
|
||||||
|
const usersByDid: Record<string, any> = {};
|
||||||
|
const usersByHandle: Record<string, any> = {};
|
||||||
|
|
||||||
|
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 messagesMapped = messages.map((msg) => {
|
||||||
const isSentByMe = msg.senderHandle === session.user.handle;
|
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 {
|
return {
|
||||||
id: msg.id,
|
id: msg.id,
|
||||||
senderHandle: msg.senderHandle,
|
senderHandle: msg.senderHandle,
|
||||||
senderDisplayName: msg.senderDisplayName,
|
senderDisplayName: displayName,
|
||||||
senderAvatarUrl: msg.senderAvatarUrl,
|
senderAvatarUrl: avatarUrl,
|
||||||
senderDid: msg.senderDid,
|
senderDid: msg.senderDid,
|
||||||
content: msg.content,
|
content: msg.content,
|
||||||
deliveredAt: msg.deliveredAt,
|
deliveredAt: msg.deliveredAt,
|
||||||
|
|||||||
Reference in New Issue
Block a user