@@ -278,28 +278,59 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
278
278
return
279
279
}
280
280
281
- // we only want to create audit logs for delete builds right now
281
+ auditor := api .Auditor .Load ()
282
+
283
+ // if user deletes a workspace, audit the workspace
282
284
if action == rbac .ActionDelete {
283
- var (
284
- auditor = api .Auditor .Load ()
285
- aReq , commitAudit = audit .InitRequest [database.Workspace ](rw , & audit.RequestParams {
286
- Audit : * auditor ,
287
- Log : api .Logger ,
288
- Request : r ,
289
- Action : database .AuditActionDelete ,
290
- })
291
- )
285
+ aReq , commitAudit := audit .InitRequest [database.Workspace ](rw , & audit.RequestParams {
286
+ Audit : * auditor ,
287
+ Log : api .Logger ,
288
+ Request : r ,
289
+ Action : database .AuditActionDelete ,
290
+ })
292
291
293
292
defer commitAudit ()
294
293
aReq .Old = workspace
295
294
}
296
295
296
+ latestBuild , latestBuildErr := api .Database .GetLatestWorkspaceBuildByWorkspaceID (ctx , workspace .ID )
297
+
298
+ // if a user starts/stops a workspace, audit the workspace build
299
+ if action == rbac .ActionUpdate {
300
+ var auditAction database.AuditAction
301
+ if createBuild .Transition == codersdk .WorkspaceTransitionStart {
302
+ auditAction = database .AuditActionStart
303
+ } else if createBuild .Transition == codersdk .WorkspaceTransitionStop {
304
+ auditAction = database .AuditActionStop
305
+ } else {
306
+ auditAction = database .AuditActionWrite
307
+ }
308
+
309
+ // We pass the workspace name to the Auditor so that it
310
+ // can form a friendly string for the user.
311
+ workspaceResourceInfo := map [string ]string {
312
+ "workspaceName" : workspace .Name ,
313
+ }
314
+
315
+ wriBytes , _ := json .Marshal (workspaceResourceInfo )
316
+
317
+ aReq , commitAudit := audit .InitRequest [database.WorkspaceBuild ](rw , & audit.RequestParams {
318
+ Audit : * auditor ,
319
+ Log : api .Logger ,
320
+ Request : r ,
321
+ Action : auditAction ,
322
+ AdditionalFields : wriBytes ,
323
+ })
324
+
325
+ defer commitAudit ()
326
+ aReq .Old = latestBuild
327
+ }
328
+
297
329
if createBuild .TemplateVersionID == uuid .Nil {
298
- latestBuild , err := api .Database .GetLatestWorkspaceBuildByWorkspaceID (ctx , workspace .ID )
299
- if err != nil {
330
+ if latestBuildErr != nil {
300
331
httpapi .Write (ctx , rw , http .StatusInternalServerError , codersdk.Response {
301
332
Message : "Internal error fetching the latest workspace build." ,
302
- Detail : err .Error (),
333
+ Detail : latestBuildErr .Error (),
303
334
})
304
335
return
305
336
}
0 commit comments