From 3bd3ce7ae43ff2fb933382a80ed1e23f92adf957 Mon Sep 17 00:00:00 2001 From: G r e y Date: Wed, 18 May 2022 18:24:46 +0000 Subject: [PATCH 1/5] feat: getWorkspaces filter site api --- site/src/api/api.test.ts | 15 ++++++++++++++- site/src/api/api.ts | 23 +++++++++++++++++++---- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/site/src/api/api.test.ts b/site/src/api/api.test.ts index 6f477646437c9..f12b32da28176 100644 --- a/site/src/api/api.test.ts +++ b/site/src/api/api.test.ts @@ -1,5 +1,5 @@ import axios from "axios" -import { getApiKey, login, logout } from "./api" +import { getApiKey, getWorkspacesURL, login, logout } from "./api" import * as TypesGen from "./typesGenerated" describe("api.ts", () => { @@ -113,4 +113,17 @@ describe("api.ts", () => { } }) }) + + describe("getWorkspacesURL", () => { + it.each<[TypesGen.WorkspaceFilter | undefined, string]>([ + [undefined, "/api/v2/workspaces"], + + [{ OrganizationID: "1", OwnerID: "" }, "/api/v2/workspaces?organization_id=1"], + [{ OrganizationID: "", OwnerID: "1" }, "/api/v2/workspaces?owner_id=1"], + + [{ OrganizationID: "1", OwnerID: "me" }, "/api/v2/workspaces?organization_id=1&owner_id=me"], + ])(`getWorkspacesURL(%p) returns %p`, (filter, expected) => { + expect(getWorkspacesURL(filter)).toBe(expected) + }) + }) }) diff --git a/site/src/api/api.ts b/site/src/api/api.ts index 500768976697f..0888e894f23f2 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -120,10 +120,25 @@ export const getWorkspace = async (workspaceId: string): Promise => { - const response = await axios.get(`/api/v2/workspaces`) +export const getWorkspacesURL = (filter?: TypesGen.WorkspaceFilter): string => { + const basePath = "/api/v2/workspaces" + const searchParams = new URLSearchParams() + + if (filter?.OrganizationID) { + searchParams.append("organization_id", filter.OrganizationID) + } + if (filter?.OwnerID) { + searchParams.append("owner_id", filter.OwnerID) + } + + const searchString = searchParams.toString() + + return searchString ? `${basePath}?${searchString}` : basePath +} + +export const getWorkspaces = async (filter?: TypesGen.WorkspaceFilter): Promise => { + const url = getWorkspacesURL(filter) + const response = await axios.get(url) return response.data } From 5a98eaa5b99c6b06e6e0e38b80b4d47919e8dc07 Mon Sep 17 00:00:00 2001 From: G r e y Date: Wed, 18 May 2022 18:29:05 +0000 Subject: [PATCH 2/5] fixup! feat: getWorkspaces filter site api --- site/src/testHelpers/handlers.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/site/src/testHelpers/handlers.ts b/site/src/testHelpers/handlers.ts index 529995fa68245..be6f201a3ceeb 100644 --- a/site/src/testHelpers/handlers.ts +++ b/site/src/testHelpers/handlers.ts @@ -36,9 +36,6 @@ export const handlers = [ rest.post("/api/v2/users/me/workspaces", async (req, res, ctx) => { return res(ctx.status(200), ctx.json(M.MockWorkspace)) }), - rest.get("/api/v2/workspaces", async (req, res, ctx) => { - return res(ctx.status(200), ctx.json([M.MockWorkspace])) - }), rest.get("/api/v2/users/me/organizations", (req, res, ctx) => { return res(ctx.status(200), ctx.json([M.MockOrganization])) }), @@ -79,6 +76,12 @@ export const handlers = [ }), // workspaces + + // REMARK: This endpoint works with query parameters, but they won't be + // reflected in the return. + rest.get("/api/v2/workspaces", async (req, res, ctx) => { + return res(ctx.status(200), ctx.json([M.MockWorkspace])) + }), rest.get("/api/v2/organizations/:organizationId/workspaces/:userName/:workspaceName", (req, res, ctx) => { if (req.params.workspaceName !== M.MockWorkspace.name) { return res( From bb2d3821e8b382271d5873cfd251cf7be84280d9 Mon Sep 17 00:00:00 2001 From: G r e y Date: Wed, 18 May 2022 20:53:24 +0000 Subject: [PATCH 3/5] fixup! feat: getWorkspaces filter site api --- site/src/api/api.test.ts | 6 +++--- site/src/api/api.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/site/src/api/api.test.ts b/site/src/api/api.test.ts index f12b32da28176..b1340f07c8b3e 100644 --- a/site/src/api/api.test.ts +++ b/site/src/api/api.test.ts @@ -118,10 +118,10 @@ describe("api.ts", () => { it.each<[TypesGen.WorkspaceFilter | undefined, string]>([ [undefined, "/api/v2/workspaces"], - [{ OrganizationID: "1", OwnerID: "" }, "/api/v2/workspaces?organization_id=1"], - [{ OrganizationID: "", OwnerID: "1" }, "/api/v2/workspaces?owner_id=1"], + [{ OrganizationID: "1", Owner: "" }, "/api/v2/workspaces?organization_id=1"], + [{ OrganizationID: "", Owner: "1" }, "/api/v2/workspaces?owner_id=1"], - [{ OrganizationID: "1", OwnerID: "me" }, "/api/v2/workspaces?organization_id=1&owner_id=me"], + [{ OrganizationID: "1", Owner: "me" }, "/api/v2/workspaces?organization_id=1&owner_id=me"], ])(`getWorkspacesURL(%p) returns %p`, (filter, expected) => { expect(getWorkspacesURL(filter)).toBe(expected) }) diff --git a/site/src/api/api.ts b/site/src/api/api.ts index 0888e894f23f2..02b640e3a608a 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -127,8 +127,8 @@ export const getWorkspacesURL = (filter?: TypesGen.WorkspaceFilter): string => { if (filter?.OrganizationID) { searchParams.append("organization_id", filter.OrganizationID) } - if (filter?.OwnerID) { - searchParams.append("owner_id", filter.OwnerID) + if (filter?.Owner) { + searchParams.append("owner_id", filter.Owner) } const searchString = searchParams.toString() From 3d24911a41fb6647faefdea2416ceb7419cd771d Mon Sep 17 00:00:00 2001 From: G r e y Date: Wed, 18 May 2022 20:56:19 +0000 Subject: [PATCH 4/5] fixup! feat: getWorkspaces filter site api --- coderd/workspaces.go | 2 +- site/src/api/api.test.ts | 4 ++-- site/src/api/api.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/coderd/workspaces.go b/coderd/workspaces.go index 4ef3b61301fe6..ac175b8885c90 100644 --- a/coderd/workspaces.go +++ b/coderd/workspaces.go @@ -112,7 +112,7 @@ func (api *api) workspaces(rw http.ResponseWriter, r *http.Request) { // Empty strings mean no filter orgFilter := r.URL.Query().Get("organization_id") - ownerFilter := r.URL.Query().Get("owner_id") + ownerFilter := r.URL.Query().Get("owner") filter := database.GetWorkspacesWithFilterParams{Deleted: false} if orgFilter != "" { diff --git a/site/src/api/api.test.ts b/site/src/api/api.test.ts index b1340f07c8b3e..5714c080d384e 100644 --- a/site/src/api/api.test.ts +++ b/site/src/api/api.test.ts @@ -119,9 +119,9 @@ describe("api.ts", () => { [undefined, "/api/v2/workspaces"], [{ OrganizationID: "1", Owner: "" }, "/api/v2/workspaces?organization_id=1"], - [{ OrganizationID: "", Owner: "1" }, "/api/v2/workspaces?owner_id=1"], + [{ OrganizationID: "", Owner: "1" }, "/api/v2/workspaces?owner=1"], - [{ OrganizationID: "1", Owner: "me" }, "/api/v2/workspaces?organization_id=1&owner_id=me"], + [{ OrganizationID: "1", Owner: "me" }, "/api/v2/workspaces?organization_id=1&owner=me"], ])(`getWorkspacesURL(%p) returns %p`, (filter, expected) => { expect(getWorkspacesURL(filter)).toBe(expected) }) diff --git a/site/src/api/api.ts b/site/src/api/api.ts index 02b640e3a608a..b2e47b628f1ad 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -128,7 +128,7 @@ export const getWorkspacesURL = (filter?: TypesGen.WorkspaceFilter): string => { searchParams.append("organization_id", filter.OrganizationID) } if (filter?.Owner) { - searchParams.append("owner_id", filter.Owner) + searchParams.append("owner", filter.Owner) } const searchString = searchParams.toString() From 4e6bda01e637572934c5915f370bc466576bd429 Mon Sep 17 00:00:00 2001 From: G r e y Date: Thu, 19 May 2022 15:47:48 +0000 Subject: [PATCH 5/5] fixup! feat: getWorkspaces filter site api --- codersdk/workspaces.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codersdk/workspaces.go b/codersdk/workspaces.go index 6e4ab7afd6e57..639edebd358b6 100644 --- a/codersdk/workspaces.go +++ b/codersdk/workspaces.go @@ -153,7 +153,7 @@ func (f WorkspaceFilter) asRequestOption() requestOption { q.Set("organization_id", f.OrganizationID.String()) } if f.Owner != "" { - q.Set("owner_id", f.Owner) + q.Set("owner", f.Owner) } r.URL.RawQuery = q.Encode() }