@@ -22,6 +22,7 @@ import (
22
22
23
23
"cdr.dev/slog"
24
24
25
+ "github.com/coder/coder/coderd/audit"
25
26
"github.com/coder/coder/coderd/autobuild/schedule"
26
27
"github.com/coder/coder/coderd/database"
27
28
"github.com/coder/coder/coderd/httpapi"
@@ -248,8 +249,18 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request)
248
249
249
250
// Create a new workspace for the currently authenticated user.
250
251
func (api * API ) postWorkspacesByOrganization (rw http.ResponseWriter , r * http.Request ) {
251
- organization := httpmw .OrganizationParam (r )
252
- apiKey := httpmw .APIKey (r )
252
+ var (
253
+ organization = httpmw .OrganizationParam (r )
254
+ apiKey = httpmw .APIKey (r )
255
+ aReq , commitAudit = audit .InitRequest [database.Workspace ](rw , & audit.RequestParams {
256
+ Features : api .FeaturesService ,
257
+ Log : api .Logger ,
258
+ Request : r ,
259
+ Action : database .AuditActionCreate ,
260
+ })
261
+ )
262
+ defer commitAudit ()
263
+
253
264
if ! api .Authorize (r , rbac .ActionCreate ,
254
265
rbac .ResourceWorkspace .InOrg (organization .ID ).WithOwner (apiKey .UserID .String ())) {
255
266
httpapi .ResourceNotFound (rw )
@@ -325,7 +336,7 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req
325
336
})
326
337
return
327
338
}
328
- if ! errors .Is (err , sql .ErrNoRows ) {
339
+ if err != nil && ! errors .Is (err , sql .ErrNoRows ) {
329
340
httpapi .Write (rw , http .StatusInternalServerError , codersdk.Response {
330
341
Message : fmt .Sprintf ("Internal error fetching workspace by name %q." , createWorkspace .Name ),
331
342
Detail : err .Error (),
@@ -457,6 +468,8 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req
457
468
})
458
469
return
459
470
}
471
+ aReq .New = workspace
472
+
460
473
users , err := api .Database .GetUsersByIDs (r .Context (), []uuid.UUID {apiKey .UserID , workspaceBuild .InitiatorID })
461
474
if err != nil {
462
475
httpapi .Write (rw , http .StatusInternalServerError , codersdk.Response {
@@ -476,7 +489,18 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req
476
489
}
477
490
478
491
func (api * API ) patchWorkspace (rw http.ResponseWriter , r * http.Request ) {
479
- workspace := httpmw .WorkspaceParam (r )
492
+ var (
493
+ workspace = httpmw .WorkspaceParam (r )
494
+ aReq , commitAudit = audit .InitRequest [database.Workspace ](rw , & audit.RequestParams {
495
+ Features : api .FeaturesService ,
496
+ Log : api .Logger ,
497
+ Request : r ,
498
+ Action : database .AuditActionWrite ,
499
+ })
500
+ )
501
+ defer commitAudit ()
502
+ aReq .Old = workspace
503
+
480
504
if ! api .Authorize (r , rbac .ActionUpdate , workspace ) {
481
505
httpapi .ResourceNotFound (rw )
482
506
return
@@ -488,18 +512,20 @@ func (api *API) patchWorkspace(rw http.ResponseWriter, r *http.Request) {
488
512
}
489
513
490
514
if req .Name == "" || req .Name == workspace .Name {
515
+ aReq .New = workspace
491
516
// Nothing changed, optionally this could be an error.
492
517
rw .WriteHeader (http .StatusNoContent )
493
518
return
494
519
}
520
+
495
521
// The reason we double check here is in case more fields can be
496
522
// patched in the future, it's enough if one changes.
497
523
name := workspace .Name
498
524
if req .Name != "" || req .Name != workspace .Name {
499
525
name = req .Name
500
526
}
501
527
502
- _ , err := api .Database .UpdateWorkspace (r .Context (), database.UpdateWorkspaceParams {
528
+ newWorkspace , err := api .Database .UpdateWorkspace (r .Context (), database.UpdateWorkspaceParams {
503
529
ID : workspace .ID ,
504
530
Name : name ,
505
531
})
@@ -534,11 +560,23 @@ func (api *API) patchWorkspace(rw http.ResponseWriter, r *http.Request) {
534
560
return
535
561
}
536
562
563
+ aReq .New = newWorkspace
537
564
rw .WriteHeader (http .StatusNoContent )
538
565
}
539
566
540
567
func (api * API ) putWorkspaceAutostart (rw http.ResponseWriter , r * http.Request ) {
541
- workspace := httpmw .WorkspaceParam (r )
568
+ var (
569
+ workspace = httpmw .WorkspaceParam (r )
570
+ aReq , commitAudit = audit .InitRequest [database.Workspace ](rw , & audit.RequestParams {
571
+ Features : api .FeaturesService ,
572
+ Log : api .Logger ,
573
+ Request : r ,
574
+ Action : database .AuditActionWrite ,
575
+ })
576
+ )
577
+ defer commitAudit ()
578
+ aReq .Old = workspace
579
+
542
580
if ! api .Authorize (r , rbac .ActionUpdate , workspace ) {
543
581
httpapi .ResourceNotFound (rw )
544
582
return
@@ -578,10 +616,26 @@ func (api *API) putWorkspaceAutostart(rw http.ResponseWriter, r *http.Request) {
578
616
})
579
617
return
580
618
}
619
+
620
+ newWorkspace := workspace
621
+ newWorkspace .AutostartSchedule = dbSched
622
+ aReq .New = newWorkspace
623
+
624
+ rw .WriteHeader (http .StatusNoContent )
581
625
}
582
626
583
627
func (api * API ) putWorkspaceTTL (rw http.ResponseWriter , r * http.Request ) {
584
- workspace := httpmw .WorkspaceParam (r )
628
+ var (
629
+ workspace = httpmw .WorkspaceParam (r )
630
+ aReq , commitAudit = audit .InitRequest [database.Workspace ](rw , & audit.RequestParams {
631
+ Features : api .FeaturesService ,
632
+ Log : api .Logger ,
633
+ Request : r ,
634
+ Action : database .AuditActionWrite ,
635
+ })
636
+ )
637
+ defer commitAudit ()
638
+
585
639
if ! api .Authorize (r , rbac .ActionUpdate , workspace ) {
586
640
httpapi .ResourceNotFound (rw )
587
641
return
@@ -592,6 +646,8 @@ func (api *API) putWorkspaceTTL(rw http.ResponseWriter, r *http.Request) {
592
646
return
593
647
}
594
648
649
+ var dbTTL sql.NullInt64
650
+
595
651
err := api .Database .InTx (func (s database.Store ) error {
596
652
template , err := s .GetTemplateByID (r .Context (), workspace .TemplateID )
597
653
if err != nil {
@@ -601,7 +657,7 @@ func (api *API) putWorkspaceTTL(rw http.ResponseWriter, r *http.Request) {
601
657
return xerrors .Errorf ("fetch workspace template: %w" , err )
602
658
}
603
659
604
- dbTTL , err : = validWorkspaceTTLMillis (req .TTLMillis , time .Duration (template .MaxTtl ))
660
+ dbTTL , err = validWorkspaceTTLMillis (req .TTLMillis , time .Duration (template .MaxTtl ))
605
661
if err != nil {
606
662
return codersdk.ValidationError {Field : "ttl_ms" , Detail : err .Error ()}
607
663
}
@@ -630,7 +686,11 @@ func (api *API) putWorkspaceTTL(rw http.ResponseWriter, r *http.Request) {
630
686
return
631
687
}
632
688
633
- httpapi .Write (rw , http .StatusOK , nil )
689
+ newWorkspace := workspace
690
+ newWorkspace .Ttl = dbTTL
691
+ aReq .New = newWorkspace
692
+
693
+ rw .WriteHeader (http .StatusNoContent )
634
694
}
635
695
636
696
func (api * API ) putExtendWorkspace (rw http.ResponseWriter , r * http.Request ) {
0 commit comments