From 407fbd4a6ffb5b28d6f24ca467f78ad844e8ebe8 Mon Sep 17 00:00:00 2001 From: kylecarbs Date: Tue, 10 May 2022 03:00:03 +0000 Subject: [PATCH] fix: Use proper endpoint for user workspaces This was a silly mistake in a prior PR, so the code wasn't actually being called! --- coderd/coderd.go | 2 +- coderd/database/databasefake/databasefake.go | 8 +----- coderd/users.go | 28 +++++++++++++++++--- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/coderd/coderd.go b/coderd/coderd.go index 9113ede221d05..67e7b0eaeae3f 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -258,7 +258,7 @@ func New(options *Options) (http.Handler, func()) { }) r.Get("/gitsshkey", api.gitSSHKey) r.Put("/gitsshkey", api.regenerateGitSSHKey) - r.Get("/workspaces", api.workspacesByOwner) + r.Get("/workspaces", api.workspacesByUser) }) }) }) diff --git a/coderd/database/databasefake/databasefake.go b/coderd/database/databasefake/databasefake.go index 825d287b6cbc9..850f5605a4ea4 100644 --- a/coderd/database/databasefake/databasefake.go +++ b/coderd/database/databasefake/databasefake.go @@ -485,7 +485,7 @@ func (q *fakeQuerier) GetWorkspacesByOrganizationIDs(_ context.Context, req data workspaces := make([]database.Workspace, 0) for _, workspace := range q.workspaces { for _, id := range req.Ids { - if workspace.ID != id { + if workspace.OrganizationID != id { continue } if workspace.Deleted != req.Deleted { @@ -494,9 +494,6 @@ func (q *fakeQuerier) GetWorkspacesByOrganizationIDs(_ context.Context, req data workspaces = append(workspaces, workspace) } } - if len(workspaces) == 0 { - return nil, sql.ErrNoRows - } return workspaces, nil } @@ -514,9 +511,6 @@ func (q *fakeQuerier) GetWorkspacesByOwnerID(_ context.Context, req database.Get } workspaces = append(workspaces, workspace) } - if len(workspaces) == 0 { - return nil, sql.ErrNoRows - } return workspaces, nil } diff --git a/coderd/users.go b/coderd/users.go index d9e2a9a9107df..2d984c8ff9a07 100644 --- a/coderd/users.go +++ b/coderd/users.go @@ -820,7 +820,8 @@ func (api *api) workspacesByUser(rw http.ResponseWriter, r *http.Request) { organizationIDs := make([]uuid.UUID, 0) for _, organization := range organizations { err = api.Authorizer.AuthorizeByRoleName(r.Context(), user.ID.String(), roles.Roles, rbac.ActionRead, rbac.ResourceWorkspace.All().InOrg(organization.ID)) - if errors.Is(err, &rbac.UnauthorizedError{}) { + var apiErr *rbac.UnauthorizedError + if xerrors.As(err, &apiErr) { continue } if err != nil { @@ -832,7 +833,8 @@ func (api *api) workspacesByUser(rw http.ResponseWriter, r *http.Request) { organizationIDs = append(organizationIDs, organization.ID) } - workspaces, err := api.Database.GetWorkspacesByOrganizationIDs(r.Context(), database.GetWorkspacesByOrganizationIDsParams{ + workspaceIDs := map[uuid.UUID]struct{}{} + allWorkspaces, err := api.Database.GetWorkspacesByOrganizationIDs(r.Context(), database.GetWorkspacesByOrganizationIDsParams{ Ids: organizationIDs, }) if err != nil { @@ -841,7 +843,27 @@ func (api *api) workspacesByUser(rw http.ResponseWriter, r *http.Request) { }) return } - apiWorkspaces, err := convertWorkspaces(r.Context(), api.Database, workspaces) + for _, ws := range allWorkspaces { + workspaceIDs[ws.ID] = struct{}{} + } + userWorkspaces, err := api.Database.GetWorkspacesByOwnerID(r.Context(), database.GetWorkspacesByOwnerIDParams{ + OwnerID: user.ID, + }) + if err != nil { + httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ + Message: fmt.Sprintf("get workspaces for user: %s", err), + }) + return + } + for _, ws := range userWorkspaces { + _, exists := workspaceIDs[ws.ID] + if exists { + continue + } + allWorkspaces = append(allWorkspaces, ws) + } + + apiWorkspaces, err := convertWorkspaces(r.Context(), api.Database, allWorkspaces) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ Message: fmt.Sprintf("convert workspaces: %s", err),