From 7120ab4b228b8cc8b73e984413fbfb9e6df30b9b Mon Sep 17 00:00:00 2001 From: Fred KISSIE Date: Tue, 12 May 2026 20:45:12 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20filter=20sites=20&=20resou?= =?UTF-8?q?rces=20by=20labels?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/routers/resource/listResources.ts | 61 ++++++++++-------------- server/routers/site/listSites.ts | 44 +++++++---------- 2 files changed, 41 insertions(+), 64 deletions(-) diff --git a/server/routers/resource/listResources.ts b/server/routers/resource/listResources.ts index c6d7d036d..49b7f2b57 100644 --- a/server/routers/resource/listResources.ts +++ b/server/routers/resource/listResources.ts @@ -162,8 +162,8 @@ export type ResourceWithTargets = { labels?: Array>; }; -function queryResourcesBase(isLabelFeatureEnabled: boolean) { - let query = db +function queryResourcesBase() { + return db .select({ resourceId: resources.resourceId, name: resources.name, @@ -209,24 +209,14 @@ function queryResourcesBase(isLabelFeatureEnabled: boolean) { .leftJoin( targetHealthCheck, eq(targetHealthCheck.targetId, targets.targetId) + ) + .groupBy( + resources.resourceId, + resourcePassword.passwordId, + resourcePincode.pincodeId, + resourceHeaderAuth.headerAuthId, + resourceHeaderAuthExtendedCompatibility.headerAuthExtendedCompatibilityId ); - - if (isLabelFeatureEnabled) { - query = query - .leftJoin( - resourceLabels, - eq(resourceLabels.resourceId, resources.resourceId) - ) - .leftJoin(labels, eq(labels.labelId, resourceLabels.labelId)); - } - - return query.groupBy( - resources.resourceId, - resourcePassword.passwordId, - resourcePincode.pincodeId, - resourceHeaderAuth.headerAuthId, - resourceHeaderAuthExtendedCompatibility.headerAuthExtendedCompatibilityId - ); } export type ListResourcesResponse = PaginatedResponse<{ @@ -390,26 +380,25 @@ export async function listResources( conditions.push(inArray(resources.resourceId, resourcesWithSite)); } if (query) { + const q = "%" + query.toLowerCase() + "%"; const queryList = [ - like( - sql`LOWER(${resources.name})`, - "%" + query.toLowerCase() + "%" - ), - like( - sql`LOWER(${resources.niceId})`, - "%" + query.toLowerCase() + "%" - ), - like( - sql`LOWER(${resources.fullDomain})`, - "%" + query.toLowerCase() + "%" - ) + like(sql`LOWER(${resources.name})`, q), + like(sql`LOWER(${resources.niceId})`, q), + like(sql`LOWER(${resources.fullDomain})`, q) ]; if (isLabelFeatureEnabled) { queryList.push( - like( - sql`LOWER(${labels.name})`, - "%" + query.toLowerCase() + "%" + inArray( + resources.resourceId, + db + .select({ id: resourceLabels.resourceId }) + .from(resourceLabels) + .innerJoin( + labels, + eq(labels.labelId, resourceLabels.labelId) + ) + .where(like(sql`LOWER(${labels.name})`, q)) ) ); } @@ -417,9 +406,7 @@ export async function listResources( conditions.push(or(...queryList)); } - const baseQuery = queryResourcesBase(isLabelFeatureEnabled).where( - and(...conditions) - ); + const baseQuery = queryResourcesBase().where(and(...conditions)); // we need to add `as` so that drizzle filters the result as a subquery const countQuery = db.$count(baseQuery.as("filtered_resources")); diff --git a/server/routers/site/listSites.ts b/server/routers/site/listSites.ts index 99f931bb9..af6514f02 100644 --- a/server/routers/site/listSites.ts +++ b/server/routers/site/listSites.ts @@ -190,8 +190,8 @@ const listSitesSchema = z.object({ }) }); -function querySitesBase(isLabelFeatureEnabled: boolean) { - let query = db +function querySitesBase() { + return db .selectDistinct({ siteId: sites.siteId, niceId: sites.niceId, @@ -231,14 +231,6 @@ function querySitesBase(isLabelFeatureEnabled: boolean) { remoteExitNodes, eq(remoteExitNodes.exitNodeId, sites.exitNodeId) ); - - if (isLabelFeatureEnabled) { - query = query - .leftJoin(siteLabels, eq(siteLabels.siteId, sites.siteId)) - .leftJoin(labels, eq(labels.labelId, siteLabels.labelId)); - } - - return query; } type SiteRowBase = Awaited>[0]; @@ -346,37 +338,35 @@ export async function listSites( conditions.push(eq(sites.status, status)); } if (query) { + const q = "%" + query.toLowerCase() + "%"; const queryList = [ - like( - sql`LOWER(${sites.name})`, - "%" + query.toLowerCase() + "%" - ), - like( - sql`LOWER(${sites.niceId})`, - "%" + query.toLowerCase() + "%" - ) + like(sql`LOWER(${sites.name})`, q), + like(sql`LOWER(${sites.niceId})`, q) ]; if (isLabelFeatureEnabled) { queryList.push( - like( - sql`LOWER(${labels.name})`, - "%" + query.toLowerCase() + "%" + inArray( + sites.siteId, + db + .select({ id: siteLabels.siteId }) + .from(siteLabels) + .innerJoin( + labels, + eq(labels.labelId, siteLabels.labelId) + ) + .where(like(sql`LOWER(${labels.name})`, q)) ) ); } conditions.push(or(...queryList)); } - const baseQuery = querySitesBase(isLabelFeatureEnabled).where( - and(...conditions) - ); + 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(isLabelFeatureEnabled) - .where(and(...conditions)) - .as("filtered_sites") + querySitesBase().where(and(...conditions)).as("filtered_sites") ); const siteListQuery = baseQuery