Skip to content

Commit e3bd559

Browse files
committed
get working
1 parent 1a14a8c commit e3bd559

File tree

7 files changed

+68
-32
lines changed

7 files changed

+68
-32
lines changed

coderd/database/databasefake/databasefake.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,18 @@ func (q *fakeQuerier) GetWorkspacesWithFilter(_ context.Context, arg database.Ge
333333
if arg.Name != "" && !strings.Contains(workspace.Name, arg.Name) {
334334
continue
335335
}
336+
if len(arg.TemplateIds) > 0 {
337+
match := false
338+
for _, id := range arg.TemplateIds {
339+
if workspace.TemplateID == id {
340+
match = true
341+
break
342+
}
343+
}
344+
if !match {
345+
continue
346+
}
347+
}
336348
workspaces = append(workspaces, workspace)
337349
}
338350

coderd/database/queries.sql.go

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/workspaces.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ WHERE
2828
owner_id = @owner_id
2929
ELSE true
3030
END
31-
-- Filter by template_id
31+
-- Filter by template_ids
3232
AND CASE
33-
WHEN @template_id :: uuid != '00000000-00000000-00000000-00000000' THEN
34-
template_id = @template_id
33+
WHEN array_length(@template_ids :: uuid[], 1) > 0 THEN
34+
template_id = ANY(@template_ids)
3535
ELSE true
3636
END
3737
-- Filter by name, matching on substring

coderd/workspaces.go

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -125,34 +125,30 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) {
125125
}
126126
}
127127

128+
nameFilter := r.URL.Query().Get("name")
129+
if nameFilter != "" {
130+
filter.Name = nameFilter
131+
}
132+
128133
templateFilter := r.URL.Query().Get("template")
129-
var templates []database.Template
130134
if templateFilter != "" {
131135
ts, err := api.Database.GetTemplatesByName(r.Context(), database.GetTemplatesByNameParams{
132136
Name: templateFilter,
133137
})
134138
if err == nil {
135-
templates = ts
139+
for _, t := range ts {
140+
filter.TemplateIds = append(filter.TemplateIds, t.ID)
141+
}
136142
}
137143
}
138144

139-
nameFilter := r.URL.Query().Get("name")
140-
if nameFilter != "" {
141-
filter.Name = nameFilter
142-
}
143-
144-
var workspaces []database.Workspace
145-
for _, template := range templates {
146-
filter.TemplateID = template.ID
147-
ws, err := api.Database.GetWorkspacesWithFilter(r.Context(), filter)
148-
if err != nil {
149-
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
150-
Message: "Internal error fetching workspaces.",
151-
Detail: err.Error(),
152-
})
153-
return
154-
}
155-
workspaces = append(workspaces, ws...)
145+
workspaces, err := api.Database.GetWorkspacesWithFilter(r.Context(), filter)
146+
if err != nil {
147+
httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{
148+
Message: "Internal error fetching workspaces.",
149+
Detail: err.Error(),
150+
})
151+
return
156152
}
157153

158154
// Only return workspaces the user can read

coderd/workspaces_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,30 @@ func TestWorkspaceFilter(t *testing.T) {
339339
require.NoError(t, err)
340340
require.Len(t, ws, 0)
341341
})
342+
t.Run("Template", func(t *testing.T) {
343+
t.Parallel()
344+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
345+
user := coderdtest.CreateFirstUser(t, client)
346+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
347+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
348+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
349+
template2 := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
350+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
351+
_ = coderdtest.CreateWorkspace(t, client, user.OrganizationID, template2.ID)
352+
353+
// empty
354+
ws, err := client.Workspaces(context.Background(), codersdk.WorkspaceFilter{})
355+
require.NoError(t, err)
356+
require.Len(t, ws, 2)
357+
358+
// single template
359+
ws, err = client.Workspaces(context.Background(), codersdk.WorkspaceFilter{
360+
Template: template.Name,
361+
})
362+
require.NoError(t, err)
363+
require.Len(t, ws, 1)
364+
require.Equal(t, workspace.ID, ws[0].ID)
365+
})
342366
}
343367

344368
func TestPostWorkspaceBuild(t *testing.T) {

codersdk/workspaces.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,9 @@ func (f WorkspaceFilter) asRequestOption() requestOption {
240240
if f.Name != "" {
241241
q.Set("name", f.Name)
242242
}
243+
if f.Template != "" {
244+
q.Set("template", f.Template)
245+
}
243246
r.URL.RawQuery = q.Encode()
244247
}
245248
}

site/src/api/typesGenerated.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ export interface WorkspaceBuildsRequest extends Pagination {
463463
readonly WorkspaceID: string
464464
}
465465

466-
// From codersdk/workspaces.go:261:6
466+
// From codersdk/workspaces.go:264:6
467467
export interface WorkspaceByOwnerAndNameParams {
468468
readonly include_deleted?: boolean
469469
}
@@ -472,6 +472,7 @@ export interface WorkspaceByOwnerAndNameParams {
472472
export interface WorkspaceFilter {
473473
readonly organization_id?: string
474474
readonly owner?: string
475+
readonly template?: string
475476
readonly name?: string
476477
}
477478

0 commit comments

Comments
 (0)