diff --git a/components/dashboard/src/admin/ProjectsSearch.tsx b/components/dashboard/src/admin/ProjectsSearch.tsx index df6da0c64946b4..3cd993119b3455 100644 --- a/components/dashboard/src/admin/ProjectsSearch.tsx +++ b/components/dashboard/src/admin/ProjectsSearch.tsx @@ -97,7 +97,7 @@ export function ProjectsSearch() { - k.key === 'Enter' && search()} onChange={(v) => { setSearchTerm(v.target.value) }} /> + k.key === 'Enter' && search()} onChange={(v) => { setSearchTerm((v.target.value).trim()) }} /> diff --git a/components/dashboard/src/admin/TeamsSearch.tsx b/components/dashboard/src/admin/TeamsSearch.tsx index 464f40e9461e78..105c40e5471074 100644 --- a/components/dashboard/src/admin/TeamsSearch.tsx +++ b/components/dashboard/src/admin/TeamsSearch.tsx @@ -81,7 +81,7 @@ export function TeamsSearch() { - k.key === 'Enter' && search()} onChange={(v) => { setSearchTerm(v.target.value) }} /> + k.key === 'Enter' && search()} onChange={(v) => { setSearchTerm((v.target.value).trim()) }} /> diff --git a/components/dashboard/src/admin/UserSearch.tsx b/components/dashboard/src/admin/UserSearch.tsx index 6158f34c98309b..b15fb2ff3486a9 100644 --- a/components/dashboard/src/admin/UserSearch.tsx +++ b/components/dashboard/src/admin/UserSearch.tsx @@ -72,7 +72,7 @@ export default function UserSearch() { - ke.key === 'Enter' && search() } onChange={(v) => { setSearchTerm(v.target.value) }} /> + ke.key === 'Enter' && search() } onChange={(v) => { setSearchTerm((v.target.value).trim()) }} /> diff --git a/components/dashboard/src/admin/WorkspacesSearch.tsx b/components/dashboard/src/admin/WorkspacesSearch.tsx index a13c58fee4a889..612f3ae743b1be 100644 --- a/components/dashboard/src/admin/WorkspacesSearch.tsx +++ b/components/dashboard/src/admin/WorkspacesSearch.tsx @@ -68,27 +68,19 @@ export function WorkspaceSearch(props: Props) { const search = async () => { setSearching(true); try { - let searchTerm: string | undefined = queryTerm; - const query: AdminGetWorkspacesQuery = { - ownerId: props?.user?.id, - }; - if (matchesInstanceIdOrLegacyWorkspaceIdExactly(searchTerm)) { - query.instanceIdOrWorkspaceId = searchTerm; - } else if (matchesNewWorkspaceIdExactly(searchTerm)) { - query.workspaceId = searchTerm; - } - if (query.workspaceId || query.instanceId || query.instanceIdOrWorkspaceId) { - searchTerm = undefined; + const query: AdminGetWorkspacesQuery = {}; + if (matchesInstanceIdOrLegacyWorkspaceIdExactly(queryTerm)) { + query.instanceIdOrWorkspaceId = queryTerm; + } else if (matchesNewWorkspaceIdExactly(queryTerm)) { + query.workspaceId = queryTerm; } - // const searchTerm = searchTerm; const result = await getGitpodService().server.adminGetWorkspaces({ limit: 100, orderBy: 'instanceCreationTime', offset: 0, orderDir: "desc", ...query, - searchTerm, }); setSearchResult(result); } finally { @@ -104,7 +96,9 @@ export function WorkspaceSearch(props: Props) { - ke.key === 'Enter' && search() } onChange={(v) => { setQueryTerm(v.target.value) }} /> + ke.key === 'Enter' && search() } + onChange={(v) => { setQueryTerm((v.target.value).trim()) }} /> diff --git a/components/gitpod-db/src/typeorm/workspace-db-impl.ts b/components/gitpod-db/src/typeorm/workspace-db-impl.ts index 19a33e760aa1c6..c5c2c42ebd30ef 100644 --- a/components/gitpod-db/src/typeorm/workspace-db-impl.ts +++ b/components/gitpod-db/src/typeorm/workspace-db-impl.ts @@ -754,7 +754,7 @@ export abstract class AbstractTypeORMWorkspaceDBImpl implements WorkspaceDB { return await queryBuilder.getCount(); } - public async findAllWorkspaceAndInstances(offset: number, limit: number, orderBy: keyof WorkspaceAndInstance, orderDir: "ASC" | "DESC", query?: AdminGetWorkspacesQuery, searchTerm?: string): Promise<{ total: number, rows: WorkspaceAndInstance[] }> { + public async findAllWorkspaceAndInstances(offset: number, limit: number, orderBy: keyof WorkspaceAndInstance, orderDir: "ASC" | "DESC", query?: AdminGetWorkspacesQuery): Promise<{ total: number, rows: WorkspaceAndInstance[] }> { let whereConditions = []; let whereConditionParams: any = {}; let instanceIdQuery: boolean = false; @@ -765,6 +765,9 @@ export abstract class AbstractTypeORMWorkspaceDBImpl implements WorkspaceDB { whereConditions.push("(wsi.id = :instanceId OR ws.id = :workspaceId)"); whereConditionParams.instanceId = query.instanceIdOrWorkspaceId; whereConditionParams.workspaceId = query.instanceIdOrWorkspaceId; + } else if (query.workspaceId) { + whereConditions.push("ws.id = :workspaceId"); + whereConditionParams.workspaceId = query.workspaceId; } else if (query.instanceId) { // in addition to adding "instanceId" to the "WHERE" clause like for the other workspace-guided queries, // we modify the JOIN condition below to a) select the correct instance and b) make the query faster @@ -772,21 +775,9 @@ export abstract class AbstractTypeORMWorkspaceDBImpl implements WorkspaceDB { whereConditions.push("wsi.id = :instanceId"); whereConditionParams.instanceId = query.instanceId; - } else if (query.workspaceId) { - whereConditions.push("ws.id = :workspaceId"); - whereConditionParams.workspaceId = query.workspaceId; - } else if (query.ownerId) { - // If an owner id is provided only search for workspaces belonging to that user. - whereConditions.push("ws.ownerId = :ownerId"); - whereConditionParams.ownerId = query.ownerId; } } - if (searchTerm) { - // If a search term is provided perform a wildcard search in the context url or exact match on the workspace id (aka workspace name) or the instance id. - whereConditions.push(`ws.contextURL LIKE '%${searchTerm}%'`); - } - let orderField: string = orderBy; switch (orderField) { case "workspaceId": orderField = "ws.id"; break; diff --git a/components/gitpod-db/src/workspace-db.spec.db.ts b/components/gitpod-db/src/workspace-db.spec.db.ts index a1c516c048416f..79b4ec676c15ec 100644 --- a/components/gitpod-db/src/workspace-db.spec.db.ts +++ b/components/gitpod-db/src/workspace-db.spec.db.ts @@ -314,28 +314,6 @@ import { DBWorkspaceInstance } from './typeorm/entity/db-workspace-instance'; expect(dbResult.total).to.eq(1); } - @test(timeout(10000)) - public async testFindAllWorkspaceAndInstances_contextUrl() { - await Promise.all([ - this.db.store(this.ws), - this.db.storeInstance(this.wsi1), - this.db.storeInstance(this.wsi2), - this.db.store(this.ws2), - this.db.storeInstance(this.ws2i1), - ]); - const dbResult = await this.db.findAllWorkspaceAndInstances(0, 10, "contextURL", "DESC", undefined, this.ws.contextURL); - // It should only find one workspace instance - expect(dbResult.total).to.eq(1); - - const workspaceAndInstance = dbResult.rows[0] - - // It should find the workspace that uses the queried context url - expect(workspaceAndInstance.workspaceId).to.eq(this.ws.id) - - // It should select the workspace instance that was most recently created - expect(workspaceAndInstance.instanceId).to.eq(this.wsi2.id) - } - @test(timeout(10000)) public async testFindAllWorkspaceAndInstances_workspaceId() { await Promise.all([ @@ -344,7 +322,7 @@ import { DBWorkspaceInstance } from './typeorm/entity/db-workspace-instance'; this.db.store(this.ws2), this.db.storeInstance(this.ws2i1), ]); - const dbResult = await this.db.findAllWorkspaceAndInstances(0, 10, "workspaceId", "DESC", { workspaceId: this.ws2.id }, undefined); + const dbResult = await this.db.findAllWorkspaceAndInstances(0, 10, "workspaceId", "DESC", { workspaceId: this.ws2.id }); // It should only find one workspace instance expect(dbResult.total).to.eq(1); @@ -361,7 +339,7 @@ import { DBWorkspaceInstance } from './typeorm/entity/db-workspace-instance'; this.db.store(this.ws2), this.db.storeInstance(this.ws2i1), ]); - const dbResult = await this.db.findAllWorkspaceAndInstances(0, 10, "workspaceId", "DESC", { instanceIdOrWorkspaceId: this.ws2.id }, undefined); + const dbResult = await this.db.findAllWorkspaceAndInstances(0, 10, "workspaceId", "DESC", { instanceIdOrWorkspaceId: this.ws2.id }); // It should only find one workspace instance expect(dbResult.total).to.eq(1); @@ -379,7 +357,7 @@ import { DBWorkspaceInstance } from './typeorm/entity/db-workspace-instance'; this.db.store(this.ws2), this.db.storeInstance(this.ws2i1), ]); - const dbResult = await this.db.findAllWorkspaceAndInstances(0, 10, "instanceId", "DESC", { instanceId: this.wsi1.id }, undefined); + const dbResult = await this.db.findAllWorkspaceAndInstances(0, 10, "instanceId", "DESC", { instanceId: this.wsi1.id }); // It should only find one workspace instance expect(dbResult.total).to.eq(1); diff --git a/components/gitpod-db/src/workspace-db.ts b/components/gitpod-db/src/workspace-db.ts index 9cc719d8ad7ec6..3dca3d2cbb813f 100644 --- a/components/gitpod-db/src/workspace-db.ts +++ b/components/gitpod-db/src/workspace-db.ts @@ -81,7 +81,7 @@ export interface WorkspaceDB { findWorkspacesForContentDeletion(minSoftDeletedTimeInDays: number, limit: number): Promise; findPrebuiltWorkspacesForGC(daysUnused: number, limit: number): Promise; findAllWorkspaces(offset: number, limit: number, orderBy: keyof Workspace, orderDir: "ASC" | "DESC", ownerId?: string, searchTerm?: string, minCreationTime?: Date, maxCreationDateTime?: Date, type?: WorkspaceType): Promise<{ total: number, rows: Workspace[] }>; - findAllWorkspaceAndInstances(offset: number, limit: number, orderBy: keyof WorkspaceAndInstance, orderDir: "ASC" | "DESC", query?: AdminGetWorkspacesQuery, searchTerm?: string): Promise<{ total: number, rows: WorkspaceAndInstance[] }>; + findAllWorkspaceAndInstances(offset: number, limit: number, orderBy: keyof WorkspaceAndInstance, orderDir: "ASC" | "DESC", query?: AdminGetWorkspacesQuery): Promise<{ total: number, rows: WorkspaceAndInstance[] }>; findWorkspaceAndInstance(id: string): Promise; findInstancesByPhaseAndRegion(phase: string, region: string): Promise; diff --git a/components/gitpod-protocol/src/admin-protocol.ts b/components/gitpod-protocol/src/admin-protocol.ts index 5c23f40691ea29..391b7166b802c6 100644 --- a/components/gitpod-protocol/src/admin-protocol.ts +++ b/components/gitpod-protocol/src/admin-protocol.ts @@ -116,5 +116,4 @@ export type AdminGetWorkspacesQuery = { instanceIdOrWorkspaceId?: string; instanceId?: string; workspaceId?: string; - ownerId?: string; }; diff --git a/components/server/ee/src/workspace/gitpod-server-impl.ts b/components/server/ee/src/workspace/gitpod-server-impl.ts index 4de1bf1c3195c9..defe22809fa153 100644 --- a/components/server/ee/src/workspace/gitpod-server-impl.ts +++ b/components/server/ee/src/workspace/gitpod-server-impl.ts @@ -586,7 +586,7 @@ export class GitpodServerEEImpl extends GitpodServerImpl { await this.guardAdminAccess("adminGetWorkspaces", { req }, Permission.ADMIN_WORKSPACES); - return await this.workspaceDb.trace(ctx).findAllWorkspaceAndInstances(req.offset, req.limit, req.orderBy, req.orderDir === "asc" ? "ASC" : "DESC", req, req.searchTerm); + return await this.workspaceDb.trace(ctx).findAllWorkspaceAndInstances(req.offset, req.limit, req.orderBy, req.orderDir === "asc" ? "ASC" : "DESC", req); } async adminGetWorkspace(ctx: TraceContext, workspaceId: string): Promise {