From 4422d97ba7ba9d19951e49d6fb4aaf2c86b84ba4 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Thu, 26 Mar 2026 22:30:07 +0100 Subject: [PATCH] fix(dm): deduplicate callerUser fetch and align federation guard pattern - Hoist callerUser DB query above the federation block so it's fetched once and reused for response building, federation ID assignment, and relay payload construction (was fetched 3 times). - Add homeInstance !== domainOrigin guard to finalTargets augmentation, matching the existing pattern in POST /api/dm/:id/members. --- packages/server/src/routes/dm.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/server/src/routes/dm.ts b/packages/server/src/routes/dm.ts index bd4da146..2e5e272c 100644 --- a/packages/server/src/routes/dm.ts +++ b/packages/server/src/routes/dm.ts @@ -564,11 +564,13 @@ export async function dmRoutes(app: FastifyInstance): Promise { } }); + // Fetch caller's user row once — used for response, federation, and relay + const callerUser = db.select().from(schema.users).where(eq(schema.users.id, request.userId)).get(); + // Federation: assign federatedId if any member is from a remote instance let federatedId: string | null = null; if (isFederationRelayEnabled()) { const domainOrigin = getOurOrigin(); - const callerUser = db.select().from(schema.users).where(eq(schema.users.id, request.userId)).get(); const allUsers = [callerUser, ...targetUsers].filter((u): u is NonNullable => u !== undefined); const hasRemote = allUsers.some(u => u.homeInstance && u.homeInstance !== domainOrigin); @@ -586,8 +588,7 @@ export async function dmRoutes(app: FastifyInstance): Promise { } // Build response - const currentUserRow = db.select().from(schema.users).where(eq(schema.users.id, request.userId)).get(); - const allMembers = [currentUserRow, ...targetUsers] + const allMembers = [callerUser, ...targetUsers] .filter((u): u is NonNullable => u !== undefined) .map(u => sanitizeUser(u)); @@ -610,7 +611,6 @@ export async function dmRoutes(app: FastifyInstance): Promise { // Federation: relay member_add for each remote member if (isFederationRelayEnabled() && federatedId) { const domainOrigin = getOurOrigin(); - const callerUser = db.select().from(schema.users).where(eq(schema.users.id, request.userId)).get(); const allParticipants = getDmParticipants(dmChannelId); for (const targetUser of targetUsers) { @@ -646,7 +646,7 @@ export async function dmRoutes(app: FastifyInstance): Promise { const targetOrigins = getGroupDmTargetOrigins(dmChannelId); // Ensure the new member's instance is in targets let finalTargets = targetOrigins; - if (finalTargets && !finalTargets.includes(targetUser.homeInstance)) { + if (finalTargets && targetUser.homeInstance !== domainOrigin && !finalTargets.includes(targetUser.homeInstance)) { finalTargets = [...finalTargets, targetUser.homeInstance]; }