feat(coderd): add audit resource for tasks (#20301)

Updates coder/internal#976
This commit is contained in:
Mathias Fredriksson
2025-10-15 16:13:59 +00:00
committed by GitHub
parent 03d285db26
commit 408b09a1f2
14 changed files with 65 additions and 7 deletions
+4 -2
View File
@@ -17247,7 +17247,8 @@ const docTemplate = `{
"idp_sync_settings_group",
"idp_sync_settings_role",
"workspace_agent",
"workspace_app"
"workspace_app",
"task"
],
"x-enum-varnames": [
"ResourceTypeTemplate",
@@ -17274,7 +17275,8 @@ const docTemplate = `{
"ResourceTypeIdpSyncSettingsGroup",
"ResourceTypeIdpSyncSettingsRole",
"ResourceTypeWorkspaceAgent",
"ResourceTypeWorkspaceApp"
"ResourceTypeWorkspaceApp",
"ResourceTypeTask"
]
},
"codersdk.Response": {
+4 -2
View File
@@ -15759,7 +15759,8 @@
"idp_sync_settings_group",
"idp_sync_settings_role",
"workspace_agent",
"workspace_app"
"workspace_app",
"task"
],
"x-enum-varnames": [
"ResourceTypeTemplate",
@@ -15786,7 +15787,8 @@
"ResourceTypeIdpSyncSettingsGroup",
"ResourceTypeIdpSyncSettingsRole",
"ResourceTypeWorkspaceAgent",
"ResourceTypeWorkspaceApp"
"ResourceTypeWorkspaceApp",
"ResourceTypeTask"
]
},
"codersdk.Response": {
+19
View File
@@ -420,6 +420,14 @@ func (api *API) auditLogIsResourceDeleted(ctx context.Context, alog database.Get
api.Logger.Error(ctx, "unable to fetch oauth2 app secret", slog.Error(err))
}
return false
case database.ResourceTypeTask:
task, err := api.Database.GetTaskByID(ctx, alog.AuditLog.ResourceID)
if xerrors.Is(err, sql.ErrNoRows) {
return true
} else if err != nil {
api.Logger.Error(ctx, "unable to fetch task", slog.Error(err))
}
return task.DeletedAt.Valid && task.DeletedAt.Time.Before(time.Now())
default:
return false
}
@@ -496,6 +504,17 @@ func (api *API) auditLogResourceLink(ctx context.Context, alog database.GetAudit
}
return fmt.Sprintf("/deployment/oauth2-provider/apps/%s", secret.AppID)
case database.ResourceTypeTask:
task, err := api.Database.GetTaskByID(ctx, alog.AuditLog.ResourceID)
if err != nil {
return ""
}
workspace, err := api.Database.GetWorkspaceByID(ctx, task.WorkspaceID.UUID)
if err != nil {
return ""
}
return fmt.Sprintf("/tasks/%s/%s", workspace.OwnerName, task.Name)
default:
return ""
}
+2 -1
View File
@@ -31,7 +31,8 @@ type Auditable interface {
database.NotificationTemplate |
idpsync.OrganizationSyncSettings |
idpsync.GroupSyncSettings |
idpsync.RoleSyncSettings
idpsync.RoleSyncSettings |
database.TaskTable
}
// Map is a map of changed fields in an audited resource. It maps field names to
+8
View File
@@ -131,6 +131,8 @@ func ResourceTarget[T Auditable](tgt T) string {
return "Organization Group Sync"
case idpsync.RoleSyncSettings:
return "Organization Role Sync"
case database.TaskTable:
return typed.Name
default:
panic(fmt.Sprintf("unknown resource %T for ResourceTarget", tgt))
}
@@ -193,6 +195,8 @@ func ResourceID[T Auditable](tgt T) uuid.UUID {
return noID // Org field on audit log has org id
case idpsync.RoleSyncSettings:
return noID // Org field on audit log has org id
case database.TaskTable:
return typed.ID
default:
panic(fmt.Sprintf("unknown resource %T for ResourceID", tgt))
}
@@ -246,6 +250,8 @@ func ResourceType[T Auditable](tgt T) database.ResourceType {
return database.ResourceTypeIdpSyncSettingsRole
case idpsync.GroupSyncSettings:
return database.ResourceTypeIdpSyncSettingsGroup
case database.TaskTable:
return database.ResourceTypeTask
default:
panic(fmt.Sprintf("unknown resource %T for ResourceType", typed))
}
@@ -302,6 +308,8 @@ func ResourceRequiresOrgID[T Auditable]() bool {
return true
case idpsync.RoleSyncSettings:
return true
case database.TaskTable:
return true
default:
panic(fmt.Sprintf("unknown resource %T for ResourceRequiresOrgID", tgt))
}
+2 -1
View File
@@ -460,7 +460,8 @@ CREATE TYPE resource_type AS ENUM (
'idp_sync_settings_role',
'workspace_agent',
'workspace_app',
'prebuilds_settings'
'prebuilds_settings',
'task'
);
CREATE TYPE startup_script_behavior AS ENUM (
@@ -0,0 +1 @@
-- Nothing to do
@@ -0,0 +1 @@
ALTER TYPE resource_type ADD VALUE IF NOT EXISTS 'task';
+4 -1
View File
@@ -2670,6 +2670,7 @@ const (
ResourceTypeWorkspaceAgent ResourceType = "workspace_agent"
ResourceTypeWorkspaceApp ResourceType = "workspace_app"
ResourceTypePrebuildsSettings ResourceType = "prebuilds_settings"
ResourceTypeTask ResourceType = "task"
)
func (e *ResourceType) Scan(src interface{}) error {
@@ -2733,7 +2734,8 @@ func (e ResourceType) Valid() bool {
ResourceTypeIdpSyncSettingsRole,
ResourceTypeWorkspaceAgent,
ResourceTypeWorkspaceApp,
ResourceTypePrebuildsSettings:
ResourceTypePrebuildsSettings,
ResourceTypeTask:
return true
}
return false
@@ -2766,6 +2768,7 @@ func AllResourceTypeValues() []ResourceType {
ResourceTypeWorkspaceAgent,
ResourceTypeWorkspaceApp,
ResourceTypePrebuildsSettings,
ResourceTypeTask,
}
}