From 02f6e2a8c3cb14f0394ae79cfaad966a6c414f3d Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 10 Jun 2026 20:56:26 -0700 Subject: [PATCH 1/2] Add ; fix lint --- src/app/[orgId]/settings/resources/public/create/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/[orgId]/settings/resources/public/create/page.tsx b/src/app/[orgId]/settings/resources/public/create/page.tsx index e80919042..be02b8e07 100644 --- a/src/app/[orgId]/settings/resources/public/create/page.tsx +++ b/src/app/[orgId]/settings/resources/public/create/page.tsx @@ -764,7 +764,7 @@ export default function Page() { ssh: "SSH", rdp: "RDP", vnc: "VNC", - } + }; } const typeOptions: OptionSelectOption[] = From 71273e1b1c7012672475dba295f0841c9054df34 Mon Sep 17 00:00:00 2001 From: Owen Date: Wed, 10 Jun 2026 21:41:34 -0700 Subject: [PATCH 2/2] Try to fix large query problem --- server/routers/site/listSites.ts | 75 +++++++++++++++++--------------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/server/routers/site/listSites.ts b/server/routers/site/listSites.ts index 37fe8630d..86699feaf 100644 --- a/server/routers/site/listSites.ts +++ b/server/routers/site/listSites.ts @@ -327,27 +327,6 @@ export async function listSites( ); } - let accessibleSites; - if (req.user) { - accessibleSites = await db - .select({ - siteId: sql`COALESCE(${userSites.siteId}, ${roleSites.siteId})` - }) - .from(userSites) - .fullJoin(roleSites, eq(userSites.siteId, roleSites.siteId)) - .where( - or( - eq(userSites.userId, req.user!.userId), - inArray(roleSites.roleId, req.userOrgRoleIds!) - ) - ); - } else { - accessibleSites = await db - .select({ siteId: sites.siteId }) - .from(sites) - .where(eq(sites.orgId, orgId)); - } - const isLabelFeatureEnabled = await isLicensedOrSubscribed( orgId, tierMatrix.labels @@ -364,14 +343,38 @@ export async function listSites( labels: labelFilter } = parsedQuery.data; - const accessibleSiteIds = accessibleSites.map((site) => site.siteId); + const conditions = [eq(sites.orgId, orgId)]; - const conditions = [ - and( - inArray(sites.siteId, accessibleSiteIds), - eq(sites.orgId, orgId) - ) - ]; + if (req.user) { + const userAccessConditions = [ + inArray( + sites.siteId, + db + .select({ siteId: userSites.siteId }) + .from(userSites) + .where(eq(userSites.userId, req.user.userId)) + ) + ]; + + const roleIds = req.userOrgRoleIds ?? []; + if (roleIds.length > 0) { + userAccessConditions.push( + inArray( + sites.siteId, + db + .select({ siteId: roleSites.siteId }) + .from(roleSites) + .where(inArray(roleSites.roleId, roleIds)) + ) + ); + } + + conditions.push( + userAccessConditions.length === 1 + ? userAccessConditions[0] + : or(...userAccessConditions)! + ); + } if (typeof online !== "undefined") { conditions.push(eq(sites.online, online)); @@ -418,17 +421,15 @@ export async function listSites( ) ); } - conditions.push(or(...queryList)); + conditions.push(or(...queryList)!); } const baseQuery = querySitesBase().where(and(...conditions)); - // we need to add `as` so that drizzle filters the result as a subquery - const countQuery = db.$count( - querySitesBase() - .where(and(...conditions)) - .as("filtered_sites") - ); + const countQuery = db + .select({ count: sql`count(*)` }) + .from(sites) + .where(and(...conditions)); const siteListQuery = baseQuery .limit(pageSize) @@ -441,11 +442,13 @@ export async function listSites( : asc(sites.name) ); - const [totalCount, rows] = await Promise.all([ + const [countRows, rows] = await Promise.all([ countQuery, siteListQuery ]); + const totalCount = Number(countRows[0]?.count ?? 0); + // Get latest version asynchronously without blocking the response const latestNewtVersionPromise = getLatestNewtVersion();