@@ -11,6 +11,7 @@ import (
11
11
"github.com/go-chi/chi/v5"
12
12
"github.com/google/uuid"
13
13
"github.com/moby/moby/pkg/namesgenerator"
14
+ "golang.org/x/sync/errgroup"
14
15
"golang.org/x/xerrors"
15
16
16
17
"github.com/coder/coder/coderd/autobuild/schedule"
@@ -30,21 +31,34 @@ func (api *api) workspace(rw http.ResponseWriter, r *http.Request) {
30
31
})
31
32
return
32
33
}
33
- job , err := api .Database .GetProvisionerJobByID (r .Context (), build .JobID )
34
+ var (
35
+ group errgroup.Group
36
+ job database.ProvisionerJob
37
+ template database.Template
38
+ owner database.User
39
+ )
40
+ group .Go (func () (err error ) {
41
+ job , err = api .Database .GetProvisionerJobByID (r .Context (), build .JobID )
42
+ return err
43
+ })
44
+ group .Go (func () (err error ) {
45
+ template , err = api .Database .GetTemplateByID (r .Context (), workspace .TemplateID )
46
+ return err
47
+ })
48
+ group .Go (func () (err error ) {
49
+ owner , err = api .Database .GetUserByID (r .Context (), workspace .OwnerID )
50
+ return err
51
+ })
52
+ err = group .Wait ()
34
53
if err != nil {
35
54
httpapi .Write (rw , http .StatusInternalServerError , httpapi.Response {
36
- Message : fmt .Sprintf ("get workspace build job : %s" , err ),
55
+ Message : fmt .Sprintf ("fetch resource : %s" , err ),
37
56
})
38
57
return
39
58
}
40
- template , err := api .Database .GetTemplateByID (r .Context (), workspace .TemplateID )
41
- if err != nil {
42
- httpapi .Write (rw , http .StatusInternalServerError , httpapi.Response {
43
- Message : fmt .Sprintf ("get template: %s" , err ),
44
- })
45
- return
46
- }
47
- httpapi .Write (rw , http .StatusOK , convertWorkspace (workspace , convertWorkspaceBuild (build , convertProvisionerJob (job )), template ))
59
+
60
+ httpapi .Write (rw , http .StatusOK ,
61
+ convertWorkspace (workspace , convertWorkspaceBuild (build , convertProvisionerJob (job )), template , owner ))
48
62
}
49
63
50
64
func (api * api ) workspaceBuilds (rw http.ResponseWriter , r * http.Request ) {
@@ -359,9 +373,11 @@ func (api *api) putWorkspaceAutostop(rw http.ResponseWriter, r *http.Request) {
359
373
func convertWorkspaces (ctx context.Context , db database.Store , workspaces []database.Workspace ) ([]codersdk.Workspace , error ) {
360
374
workspaceIDs := make ([]uuid.UUID , 0 , len (workspaces ))
361
375
templateIDs := make ([]uuid.UUID , 0 , len (workspaces ))
376
+ ownerIDs := make ([]uuid.UUID , 0 , len (workspaces ))
362
377
for _ , workspace := range workspaces {
363
378
workspaceIDs = append (workspaceIDs , workspace .ID )
364
379
templateIDs = append (templateIDs , workspace .TemplateID )
380
+ ownerIDs = append (ownerIDs , workspace .OwnerID )
365
381
}
366
382
workspaceBuilds , err := db .GetWorkspaceBuildsByWorkspaceIDsWithoutAfter (ctx , workspaceIDs )
367
383
if errors .Is (err , sql .ErrNoRows ) {
@@ -377,6 +393,10 @@ func convertWorkspaces(ctx context.Context, db database.Store, workspaces []data
377
393
if err != nil {
378
394
return nil , xerrors .Errorf ("get templates: %w" , err )
379
395
}
396
+ users , err := db .GetUsersByIDs (ctx , ownerIDs )
397
+ if err != nil {
398
+ return nil , xerrors .Errorf ("get users: %w" , err )
399
+ }
380
400
jobIDs := make ([]uuid.UUID , 0 , len (workspaceBuilds ))
381
401
for _ , build := range workspaceBuilds {
382
402
jobIDs = append (jobIDs , build .JobID )
@@ -397,6 +417,10 @@ func convertWorkspaces(ctx context.Context, db database.Store, workspaces []data
397
417
for _ , template := range templates {
398
418
templateByID [template .ID ] = template
399
419
}
420
+ userByID := map [uuid.UUID ]database.User {}
421
+ for _ , user := range users {
422
+ userByID [user .ID ] = user
423
+ }
400
424
jobByID := map [uuid.UUID ]database.ProvisionerJob {}
401
425
for _ , job := range jobs {
402
426
jobByID [job .ID ] = job
@@ -413,20 +437,25 @@ func convertWorkspaces(ctx context.Context, db database.Store, workspaces []data
413
437
}
414
438
job , exists := jobByID [build .JobID ]
415
439
if ! exists {
416
- return nil , xerrors .Errorf ("build job not found for workspace: %q" , err )
440
+ return nil , xerrors .Errorf ("build job not found for workspace: %w" , err )
441
+ }
442
+ user , exists := userByID [workspace .OwnerID ]
443
+ if ! exists {
444
+ return nil , xerrors .Errorf ("owner not found for workspace: %q" , workspace .Name )
417
445
}
418
446
apiWorkspaces = append (apiWorkspaces ,
419
- convertWorkspace (workspace , convertWorkspaceBuild (build , convertProvisionerJob (job )), template ))
447
+ convertWorkspace (workspace , convertWorkspaceBuild (build , convertProvisionerJob (job )), template , user ))
420
448
}
421
449
return apiWorkspaces , nil
422
450
}
423
451
424
- func convertWorkspace (workspace database.Workspace , workspaceBuild codersdk.WorkspaceBuild , template database.Template ) codersdk.Workspace {
452
+ func convertWorkspace (workspace database.Workspace , workspaceBuild codersdk.WorkspaceBuild , template database.Template , owner database. User ) codersdk.Workspace {
425
453
return codersdk.Workspace {
426
454
ID : workspace .ID ,
427
455
CreatedAt : workspace .CreatedAt ,
428
456
UpdatedAt : workspace .UpdatedAt ,
429
457
OwnerID : workspace .OwnerID ,
458
+ OwnerName : owner .Username ,
430
459
TemplateID : workspace .TemplateID ,
431
460
LatestBuild : workspaceBuild ,
432
461
TemplateName : template .Name ,
0 commit comments