Skip to content

Commit daa34cf

Browse files
authored
fix: Return deleted users when fetching workspace builds (coder#4441)
Fixes coder#4359.
1 parent 85c6795 commit daa34cf

File tree

7 files changed

+52
-26
lines changed

7 files changed

+52
-26
lines changed

coderd/database/databasefake/databasefake.go

+2-5
Original file line numberDiff line numberDiff line change
@@ -479,19 +479,16 @@ func (q *fakeQuerier) GetUsers(_ context.Context, params database.GetUsersParams
479479
return users, nil
480480
}
481481

482-
func (q *fakeQuerier) GetUsersByIDs(_ context.Context, params database.GetUsersByIDsParams) ([]database.User, error) {
482+
func (q *fakeQuerier) GetUsersByIDs(_ context.Context, ids []uuid.UUID) ([]database.User, error) {
483483
q.mutex.RLock()
484484
defer q.mutex.RUnlock()
485485

486486
users := make([]database.User, 0)
487487
for _, user := range q.users {
488-
for _, id := range params.IDs {
488+
for _, id := range ids {
489489
if user.ID.String() != id.String() {
490490
continue
491491
}
492-
if user.Deleted != params.Deleted {
493-
continue
494-
}
495492
users = append(users, user)
496493
}
497494
}

coderd/database/querier.go

+4-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

+6-8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/users.sql

+4-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ LIMIT
99
1;
1010

1111
-- name: GetUsersByIDs :many
12-
SELECT * FROM users WHERE id = ANY(@ids :: uuid [ ]) AND deleted = @deleted;
12+
-- This shouldn't check for deleted, because it's frequently used
13+
-- to look up references to actions. eg. a user could build a workspace
14+
-- for another user, then be deleted... we still want them to appear!
15+
SELECT * FROM users WHERE id = ANY(@ids :: uuid [ ]);
1316

1417
-- name: GetUserByEmailOrUsername :one
1518
SELECT

coderd/workspacebuilds.go

+4-8
Original file line numberDiff line numberDiff line change
@@ -492,11 +492,9 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
492492
return
493493
}
494494

495-
users, err := api.Database.GetUsersByIDs(ctx, database.GetUsersByIDsParams{
496-
IDs: []uuid.UUID{
497-
workspace.OwnerID,
498-
workspaceBuild.InitiatorID,
499-
},
495+
users, err := api.Database.GetUsersByIDs(ctx, []uuid.UUID{
496+
workspace.OwnerID,
497+
workspaceBuild.InitiatorID,
500498
})
501499
if err != nil {
502500
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
@@ -679,9 +677,7 @@ func (api *API) workspaceBuildsData(ctx context.Context, workspaces []database.W
679677
for _, workspace := range workspaces {
680678
userIDs = append(userIDs, workspace.OwnerID)
681679
}
682-
users, err := api.Database.GetUsersByIDs(ctx, database.GetUsersByIDsParams{
683-
IDs: userIDs,
684-
})
680+
users, err := api.Database.GetUsersByIDs(ctx, userIDs)
685681
if err != nil {
686682
return workspaceBuildsData{}, xerrors.Errorf("get users: %w", err)
687683
}

coderd/workspacebuilds_test.go

+31
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,37 @@ func TestWorkspaceBuilds(t *testing.T) {
178178
require.Len(t, builds, 1)
179179
})
180180

181+
t.Run("DeletedInitiator", func(t *testing.T) {
182+
t.Parallel()
183+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
184+
first := coderdtest.CreateFirstUser(t, client)
185+
second := coderdtest.CreateAnotherUser(t, client, first.OrganizationID, "owner")
186+
187+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
188+
defer cancel()
189+
190+
secondUser, err := second.User(ctx, codersdk.Me)
191+
require.NoError(t, err, "fetch me")
192+
version := coderdtest.CreateTemplateVersion(t, client, first.OrganizationID, nil)
193+
template := coderdtest.CreateTemplate(t, client, first.OrganizationID, version.ID)
194+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
195+
workspace, err := second.CreateWorkspace(ctx, first.OrganizationID, first.UserID.String(), codersdk.CreateWorkspaceRequest{
196+
TemplateID: template.ID,
197+
Name: "example",
198+
})
199+
require.NoError(t, err)
200+
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
201+
202+
err = client.DeleteUser(ctx, secondUser.ID)
203+
require.NoError(t, err)
204+
205+
builds, err := client.WorkspaceBuilds(ctx, codersdk.WorkspaceBuildsRequest{WorkspaceID: workspace.ID})
206+
require.Len(t, builds, 1)
207+
require.Equal(t, int32(1), builds[0].BuildNumber)
208+
require.Equal(t, secondUser.Username, builds[0].InitiatorUsername)
209+
require.NoError(t, err)
210+
})
211+
181212
t.Run("PaginateNonExistentRow", func(t *testing.T) {
182213
t.Parallel()
183214
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})

coderd/workspaces.go

+1-3
Original file line numberDiff line numberDiff line change
@@ -463,9 +463,7 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req
463463
}
464464
aReq.New = workspace
465465

466-
users, err := api.Database.GetUsersByIDs(ctx, database.GetUsersByIDsParams{
467-
IDs: []uuid.UUID{user.ID, workspaceBuild.InitiatorID},
468-
})
466+
users, err := api.Database.GetUsersByIDs(ctx, []uuid.UUID{user.ID, workspaceBuild.InitiatorID})
469467
if err != nil {
470468
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
471469
Message: "Internal error fetching user.",

0 commit comments

Comments
 (0)