From 4ad041d8e56009588e2d5580eb9da99203562ea2 Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Sat, 24 May 2025 20:47:48 +0000 Subject: [PATCH 1/8] fix: user user.name as owner_name instead of user.username --- cli/testdata/coder_list_--output_json.golden | 1 + coderd/apidoc/docs.go | 3 + coderd/apidoc/swagger.json | 3 + coderd/database/dump.sql | 2 + ...orkspace_with_correct_owner_names.down.sql | 241 ++++++++++++++++++ ..._workspace_with_correct_owner_names.up.sql | 206 +++++++++++++++ coderd/database/modelqueries.go | 1 + coderd/database/models.go | 2 + coderd/database/queries.sql.go | 26 +- coderd/database/queries/workspaces.sql | 1 + coderd/workspacebuilds.go | 3 +- coderd/workspacebuilds_test.go | 3 +- codersdk/workspacebuilds.go | 3 +- docs/reference/api/builds.md | 16 +- docs/reference/api/schemas.md | 10 +- docs/reference/api/workspaces.md | 18 +- site/src/api/typesGenerated.ts | 3 +- 17 files changed, 515 insertions(+), 27 deletions(-) create mode 100644 coderd/database/migrations/000330_workspace_with_correct_owner_names.down.sql create mode 100644 coderd/database/migrations/000330_workspace_with_correct_owner_names.up.sql diff --git a/cli/testdata/coder_list_--output_json.golden b/cli/testdata/coder_list_--output_json.golden index c37c89c4efe2a..225ad049630dd 100644 --- a/cli/testdata/coder_list_--output_json.golden +++ b/cli/testdata/coder_list_--output_json.golden @@ -24,6 +24,7 @@ "workspace_name": "test-workspace", "workspace_owner_id": "==========[first user ID]===========", "workspace_owner_name": "testuser", + "workspace_owner_username": "testuser", "template_version_id": "============[version ID]============", "template_version_name": "===========[version name]===========", "build_number": 1, diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index 7cee63e183e7e..85ac9164cfec2 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -17813,6 +17813,9 @@ const docTemplate = `{ }, "workspace_owner_name": { "type": "string" + }, + "workspace_owner_username": { + "type": "string" } } }, diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index 89a582091496f..1eaecebb1d12f 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -16270,6 +16270,9 @@ }, "workspace_owner_name": { "type": "string" + }, + "workspace_owner_username": { + "type": "string" } } }, diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index ec196405df2d3..f55aab86f042e 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -1507,6 +1507,7 @@ COMMENT ON COLUMN template_versions.message IS 'Message describing the changes i CREATE VIEW visible_users AS SELECT users.id, users.username, + users.name, users.avatar_url FROM users; @@ -2243,6 +2244,7 @@ CREATE VIEW workspaces_expanded AS workspaces.next_start_at, visible_users.avatar_url AS owner_avatar_url, visible_users.username AS owner_username, + visible_users.name AS owner_name, organizations.name AS organization_name, organizations.display_name AS organization_display_name, organizations.icon AS organization_icon, diff --git a/coderd/database/migrations/000330_workspace_with_correct_owner_names.down.sql b/coderd/database/migrations/000330_workspace_with_correct_owner_names.down.sql new file mode 100644 index 0000000000000..2792c5a1d6666 --- /dev/null +++ b/coderd/database/migrations/000330_workspace_with_correct_owner_names.down.sql @@ -0,0 +1,241 @@ +-- Recreate `template_version_with_user` as described in dump.sql +DROP VIEW template_version_with_user; + +CREATE VIEW template_version_with_user AS +SELECT + template_versions.id, + template_versions.template_id, + template_versions.organization_id, + template_versions.created_at, + template_versions.updated_at, + template_versions.name, + template_versions.readme, + template_versions.job_id, + template_versions.created_by, + template_versions.external_auth_providers, + template_versions.message, + template_versions.archived, + template_versions.source_example_id, + COALESCE( + visible_users.avatar_url, + ''::text + ) AS created_by_avatar_url, + COALESCE( + visible_users.username, + ''::text + ) AS created_by_username +FROM ( + template_versions + LEFT JOIN visible_users ON ( + template_versions.created_by = visible_users.id + ) + ); + +COMMENT ON VIEW template_version_with_user IS 'Joins in the username + avatar url of the created by user.'; + +-- Recreate `visible_users` as described in dump.sql +DROP VIEW visible_users; + +CREATE VIEW visible_users AS +SELECT users.id, users.username, users.avatar_url +FROM users; + +COMMENT ON VIEW visible_users IS 'Visible fields of users are allowed to be joined with other tables for including context of other resources.'; + +-- Recreate `workspace_build_with_user` as described in dump.sql +DROP VIEW workspace_build_with_user; + +CREATE VIEW workspace_build_with_user AS +SELECT + workspace_builds.id, + workspace_builds.created_at, + workspace_builds.updated_at, + workspace_builds.workspace_id, + workspace_builds.template_version_id, + workspace_builds.build_number, + workspace_builds.transition, + workspace_builds.initiator_id, + workspace_builds.provisioner_state, + workspace_builds.job_id, + workspace_builds.deadline, + workspace_builds.reason, + workspace_builds.daily_cost, + workspace_builds.max_deadline, + workspace_builds.template_version_preset_id, + COALESCE( + visible_users.avatar_url, + ''::text + ) AS initiator_by_avatar_url, + COALESCE( + visible_users.username, + ''::text + ) AS initiator_by_username +FROM ( + workspace_builds + LEFT JOIN visible_users ON ( + ( + workspace_builds.initiator_id = visible_users.id + ) + ) + ); + +COMMENT ON VIEW workspace_build_with_user IS 'Joins in the username + avatar url of the initiated by user.'; + +-- Recreate `workspaces_expanded` as described in dump.sql +DROP VIEW workspaces_expanded; + +CREATE VIEW workspaces_expanded AS +SELECT + workspaces.id, + workspaces.created_at, + workspaces.updated_at, + workspaces.owner_id, + workspaces.organization_id, + workspaces.template_id, + workspaces.deleted, + workspaces.name, + workspaces.autostart_schedule, + workspaces.ttl, + workspaces.last_used_at, + workspaces.dormant_at, + workspaces.deleting_at, + workspaces.automatic_updates, + workspaces.favorite, + workspaces.next_start_at, + visible_users.avatar_url AS owner_avatar_url, + visible_users.username AS owner_username, + organizations.name AS organization_name, + organizations.display_name AS organization_display_name, + organizations.icon AS organization_icon, + organizations.description AS organization_description, + templates.name AS template_name, + templates.display_name AS template_display_name, + templates.icon AS template_icon, + templates.description AS template_description +FROM ( + ( + ( + workspaces + JOIN visible_users ON ( + ( + workspaces.owner_id = visible_users.id + ) + ) + ) + JOIN organizations ON ( + ( + workspaces.organization_id = organizations.id + ) + ) + ) + JOIN templates ON ( + ( + workspaces.template_id = templates.id + ) + ) + ); + +COMMENT ON VIEW workspaces_expanded IS 'Joins in the display name information such as username, avatar, and organization name.'; + +-- Recreate `template_with_names` as described in dump.sql +DROP VIEW template_with_names; + +CREATE VIEW template_with_names AS +SELECT + templates.id, + templates.created_at, + templates.updated_at, + templates.organization_id, + templates.deleted, + templates.name, + templates.provisioner, + templates.active_version_id, + templates.description, + templates.default_ttl, + templates.created_by, + templates.icon, + templates.user_acl, + templates.group_acl, + templates.display_name, + templates.allow_user_cancel_workspace_jobs, + templates.allow_user_autostart, + templates.allow_user_autostop, + templates.failure_ttl, + templates.time_til_dormant, + templates.time_til_dormant_autodelete, + templates.autostop_requirement_days_of_week, + templates.autostop_requirement_weeks, + templates.autostart_block_days_of_week, + templates.require_active_version, + templates.deprecated, + templates.activity_bump, + templates.max_port_sharing_level, + templates.use_classic_parameter_flow, + COALESCE( + visible_users.avatar_url, + ''::text + ) AS created_by_avatar_url, + COALESCE( + visible_users.username, + ''::text + ) AS created_by_username, + COALESCE(organizations.name, ''::text) AS organization_name, + COALESCE( + organizations.display_name, + ''::text + ) AS organization_display_name, + COALESCE(organizations.icon, ''::text) AS organization_icon +FROM ( + ( + templates + LEFT JOIN visible_users ON ( + ( + templates.created_by = visible_users.id + ) + ) + ) + LEFT JOIN organizations ON ( + ( + templates.organization_id = organizations.id + ) + ) + ); + +COMMENT ON VIEW template_with_names IS 'Joins in the display name information such as username, avatar, and organization name.'; + +-- Recreate `template_version_with_user` as described in dump.sql +DROP VIEW template_version_with_user; + +CREATE VIEW template_version_with_user AS +SELECT + template_versions.id, + template_versions.template_id, + template_versions.organization_id, + template_versions.created_at, + template_versions.updated_at, + template_versions.name, + template_versions.readme, + template_versions.job_id, + template_versions.created_by, + template_versions.external_auth_providers, + template_versions.message, + template_versions.archived, + template_versions.source_example_id, + COALESCE( + visible_users.avatar_url, + ''::text + ) AS created_by_avatar_url, + COALESCE( + visible_users.username, + ''::text + ) AS created_by_username +FROM ( + template_versions + LEFT JOIN visible_users ON ( + ( + template_versions.created_by = visible_users.id + ) + ) + ); + +COMMENT ON VIEW template_version_with_user IS 'Joins in the username + avatar url of the created by user.'; diff --git a/coderd/database/migrations/000330_workspace_with_correct_owner_names.up.sql b/coderd/database/migrations/000330_workspace_with_correct_owner_names.up.sql new file mode 100644 index 0000000000000..86e51f5467a2a --- /dev/null +++ b/coderd/database/migrations/000330_workspace_with_correct_owner_names.up.sql @@ -0,0 +1,206 @@ +DROP VIEW template_version_with_user; + +DROP VIEW workspace_build_with_user; + +DROP VIEW template_with_names; + +DROP VIEW workspaces_expanded; + +DROP VIEW visible_users; + +-- Adds users.name +CREATE VIEW visible_users AS +SELECT users.id, users.username, users.name, users.avatar_url +FROM users; + +COMMENT ON VIEW visible_users IS 'Visible fields of users are allowed to be joined with other tables for including context of other resources.'; + +-- Recreate `workspace_build_with_user` as described in dump.sql +CREATE VIEW workspace_build_with_user AS +SELECT + workspace_builds.id, + workspace_builds.created_at, + workspace_builds.updated_at, + workspace_builds.workspace_id, + workspace_builds.template_version_id, + workspace_builds.build_number, + workspace_builds.transition, + workspace_builds.initiator_id, + workspace_builds.provisioner_state, + workspace_builds.job_id, + workspace_builds.deadline, + workspace_builds.reason, + workspace_builds.daily_cost, + workspace_builds.max_deadline, + workspace_builds.template_version_preset_id, + COALESCE( + visible_users.avatar_url, + ''::text + ) AS initiator_by_avatar_url, + COALESCE( + visible_users.username, + ''::text + ) AS initiator_by_username +FROM ( + workspace_builds + LEFT JOIN visible_users ON ( + ( + workspace_builds.initiator_id = visible_users.id + ) + ) + ); + +COMMENT ON VIEW workspace_build_with_user IS 'Joins in the username + avatar url of the initiated by user.'; + +-- Recreate `template_with_names` as described in dump.sql +CREATE VIEW template_with_names AS +SELECT + templates.id, + templates.created_at, + templates.updated_at, + templates.organization_id, + templates.deleted, + templates.name, + templates.provisioner, + templates.active_version_id, + templates.description, + templates.default_ttl, + templates.created_by, + templates.icon, + templates.user_acl, + templates.group_acl, + templates.display_name, + templates.allow_user_cancel_workspace_jobs, + templates.allow_user_autostart, + templates.allow_user_autostop, + templates.failure_ttl, + templates.time_til_dormant, + templates.time_til_dormant_autodelete, + templates.autostop_requirement_days_of_week, + templates.autostop_requirement_weeks, + templates.autostart_block_days_of_week, + templates.require_active_version, + templates.deprecated, + templates.activity_bump, + templates.max_port_sharing_level, + templates.use_classic_parameter_flow, + COALESCE( + visible_users.avatar_url, + ''::text + ) AS created_by_avatar_url, + COALESCE( + visible_users.username, + ''::text + ) AS created_by_username, + COALESCE(organizations.name, ''::text) AS organization_name, + COALESCE( + organizations.display_name, + ''::text + ) AS organization_display_name, + COALESCE(organizations.icon, ''::text) AS organization_icon +FROM ( + ( + templates + LEFT JOIN visible_users ON ( + ( + templates.created_by = visible_users.id + ) + ) + ) + LEFT JOIN organizations ON ( + ( + templates.organization_id = organizations.id + ) + ) + ); + +COMMENT ON VIEW template_with_names IS 'Joins in the display name information such as username, avatar, and organization name.'; + +-- Recreate `template_version_with_user` as described in dump.sql +CREATE VIEW template_version_with_user AS +SELECT + template_versions.id, + template_versions.template_id, + template_versions.organization_id, + template_versions.created_at, + template_versions.updated_at, + template_versions.name, + template_versions.readme, + template_versions.job_id, + template_versions.created_by, + template_versions.external_auth_providers, + template_versions.message, + template_versions.archived, + template_versions.source_example_id, + COALESCE( + visible_users.avatar_url, + ''::text + ) AS created_by_avatar_url, + COALESCE( + visible_users.username, + ''::text + ) AS created_by_username +FROM ( + template_versions + LEFT JOIN visible_users ON ( + template_versions.created_by = visible_users.id + ) + ); + +COMMENT ON VIEW template_version_with_user IS 'Joins in the username + avatar url of the created by user.'; + +-- Recreate `workspaces_expanded` as described in dump.sql + +CREATE VIEW workspaces_expanded AS +SELECT + workspaces.id, + workspaces.created_at, + workspaces.updated_at, + workspaces.owner_id, + workspaces.organization_id, + workspaces.template_id, + workspaces.deleted, + workspaces.name, + workspaces.autostart_schedule, + workspaces.ttl, + workspaces.last_used_at, + workspaces.dormant_at, + workspaces.deleting_at, + workspaces.automatic_updates, + workspaces.favorite, + workspaces.next_start_at, + visible_users.avatar_url AS owner_avatar_url, + visible_users.username AS owner_username, + visible_users.name AS owner_name, + organizations.name AS organization_name, + organizations.display_name AS organization_display_name, + organizations.icon AS organization_icon, + organizations.description AS organization_description, + templates.name AS template_name, + templates.display_name AS template_display_name, + templates.icon AS template_icon, + templates.description AS template_description +FROM ( + ( + ( + workspaces + JOIN visible_users ON ( + ( + workspaces.owner_id = visible_users.id + ) + ) + ) + JOIN organizations ON ( + ( + workspaces.organization_id = organizations.id + ) + ) + ) + JOIN templates ON ( + ( + workspaces.template_id = templates.id + ) + ) + ); + +COMMENT ON VIEW workspaces_expanded IS 'Joins in the display name information such as username, avatar, and organization name.'; diff --git a/coderd/database/modelqueries.go b/coderd/database/modelqueries.go index 4144c183de380..1b24090875e2c 100644 --- a/coderd/database/modelqueries.go +++ b/coderd/database/modelqueries.go @@ -294,6 +294,7 @@ func (q *sqlQuerier) GetAuthorizedWorkspaces(ctx context.Context, arg GetWorkspa &i.NextStartAt, &i.OwnerAvatarUrl, &i.OwnerUsername, + &i.OwnerName, &i.OrganizationName, &i.OrganizationDisplayName, &i.OrganizationIcon, diff --git a/coderd/database/models.go b/coderd/database/models.go index d5047f6bbe65f..522dbf9be95aa 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -3443,6 +3443,7 @@ type UserStatusChange struct { type VisibleUser struct { ID uuid.UUID `db:"id" json:"id"` Username string `db:"username" json:"username"` + Name string `db:"name" json:"name"` AvatarURL string `db:"avatar_url" json:"avatar_url"` } @@ -3475,6 +3476,7 @@ type Workspace struct { NextStartAt sql.NullTime `db:"next_start_at" json:"next_start_at"` OwnerAvatarUrl string `db:"owner_avatar_url" json:"owner_avatar_url"` OwnerUsername string `db:"owner_username" json:"owner_username"` + OwnerName string `db:"owner_name" json:"owner_name"` OrganizationName string `db:"organization_name" json:"organization_name"` OrganizationDisplayName string `db:"organization_display_name" json:"organization_display_name"` OrganizationIcon string `db:"organization_icon" json:"organization_icon"` diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index ffd8ccb035206..59b25575430bd 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -18076,7 +18076,7 @@ func (q *sqlQuerier) GetDeploymentWorkspaceStats(ctx context.Context) (GetDeploy const getWorkspaceByAgentID = `-- name: GetWorkspaceByAgentID :one SELECT - id, created_at, updated_at, owner_id, organization_id, template_id, deleted, name, autostart_schedule, ttl, last_used_at, dormant_at, deleting_at, automatic_updates, favorite, next_start_at, owner_avatar_url, owner_username, organization_name, organization_display_name, organization_icon, organization_description, template_name, template_display_name, template_icon, template_description + id, created_at, updated_at, owner_id, organization_id, template_id, deleted, name, autostart_schedule, ttl, last_used_at, dormant_at, deleting_at, automatic_updates, favorite, next_start_at, owner_avatar_url, owner_username, owner_name, organization_name, organization_display_name, organization_icon, organization_description, template_name, template_display_name, template_icon, template_description FROM workspaces_expanded as workspaces WHERE @@ -18126,6 +18126,7 @@ func (q *sqlQuerier) GetWorkspaceByAgentID(ctx context.Context, agentID uuid.UUI &i.NextStartAt, &i.OwnerAvatarUrl, &i.OwnerUsername, + &i.OwnerName, &i.OrganizationName, &i.OrganizationDisplayName, &i.OrganizationIcon, @@ -18140,7 +18141,7 @@ func (q *sqlQuerier) GetWorkspaceByAgentID(ctx context.Context, agentID uuid.UUI const getWorkspaceByID = `-- name: GetWorkspaceByID :one SELECT - id, created_at, updated_at, owner_id, organization_id, template_id, deleted, name, autostart_schedule, ttl, last_used_at, dormant_at, deleting_at, automatic_updates, favorite, next_start_at, owner_avatar_url, owner_username, organization_name, organization_display_name, organization_icon, organization_description, template_name, template_display_name, template_icon, template_description + id, created_at, updated_at, owner_id, organization_id, template_id, deleted, name, autostart_schedule, ttl, last_used_at, dormant_at, deleting_at, automatic_updates, favorite, next_start_at, owner_avatar_url, owner_username, owner_name, organization_name, organization_display_name, organization_icon, organization_description, template_name, template_display_name, template_icon, template_description FROM workspaces_expanded WHERE @@ -18171,6 +18172,7 @@ func (q *sqlQuerier) GetWorkspaceByID(ctx context.Context, id uuid.UUID) (Worksp &i.NextStartAt, &i.OwnerAvatarUrl, &i.OwnerUsername, + &i.OwnerName, &i.OrganizationName, &i.OrganizationDisplayName, &i.OrganizationIcon, @@ -18185,7 +18187,7 @@ func (q *sqlQuerier) GetWorkspaceByID(ctx context.Context, id uuid.UUID) (Worksp const getWorkspaceByOwnerIDAndName = `-- name: GetWorkspaceByOwnerIDAndName :one SELECT - id, created_at, updated_at, owner_id, organization_id, template_id, deleted, name, autostart_schedule, ttl, last_used_at, dormant_at, deleting_at, automatic_updates, favorite, next_start_at, owner_avatar_url, owner_username, organization_name, organization_display_name, organization_icon, organization_description, template_name, template_display_name, template_icon, template_description + id, created_at, updated_at, owner_id, organization_id, template_id, deleted, name, autostart_schedule, ttl, last_used_at, dormant_at, deleting_at, automatic_updates, favorite, next_start_at, owner_avatar_url, owner_username, owner_name, organization_name, organization_display_name, organization_icon, organization_description, template_name, template_display_name, template_icon, template_description FROM workspaces_expanded as workspaces WHERE @@ -18223,6 +18225,7 @@ func (q *sqlQuerier) GetWorkspaceByOwnerIDAndName(ctx context.Context, arg GetWo &i.NextStartAt, &i.OwnerAvatarUrl, &i.OwnerUsername, + &i.OwnerName, &i.OrganizationName, &i.OrganizationDisplayName, &i.OrganizationIcon, @@ -18237,7 +18240,7 @@ func (q *sqlQuerier) GetWorkspaceByOwnerIDAndName(ctx context.Context, arg GetWo const getWorkspaceByResourceID = `-- name: GetWorkspaceByResourceID :one SELECT - id, created_at, updated_at, owner_id, organization_id, template_id, deleted, name, autostart_schedule, ttl, last_used_at, dormant_at, deleting_at, automatic_updates, favorite, next_start_at, owner_avatar_url, owner_username, organization_name, organization_display_name, organization_icon, organization_description, template_name, template_display_name, template_icon, template_description + id, created_at, updated_at, owner_id, organization_id, template_id, deleted, name, autostart_schedule, ttl, last_used_at, dormant_at, deleting_at, automatic_updates, favorite, next_start_at, owner_avatar_url, owner_username, owner_name, organization_name, organization_display_name, organization_icon, organization_description, template_name, template_display_name, template_icon, template_description FROM workspaces_expanded as workspaces WHERE @@ -18282,6 +18285,7 @@ func (q *sqlQuerier) GetWorkspaceByResourceID(ctx context.Context, resourceID uu &i.NextStartAt, &i.OwnerAvatarUrl, &i.OwnerUsername, + &i.OwnerName, &i.OrganizationName, &i.OrganizationDisplayName, &i.OrganizationIcon, @@ -18296,7 +18300,7 @@ func (q *sqlQuerier) GetWorkspaceByResourceID(ctx context.Context, resourceID uu const getWorkspaceByWorkspaceAppID = `-- name: GetWorkspaceByWorkspaceAppID :one SELECT - id, created_at, updated_at, owner_id, organization_id, template_id, deleted, name, autostart_schedule, ttl, last_used_at, dormant_at, deleting_at, automatic_updates, favorite, next_start_at, owner_avatar_url, owner_username, organization_name, organization_display_name, organization_icon, organization_description, template_name, template_display_name, template_icon, template_description + id, created_at, updated_at, owner_id, organization_id, template_id, deleted, name, autostart_schedule, ttl, last_used_at, dormant_at, deleting_at, automatic_updates, favorite, next_start_at, owner_avatar_url, owner_username, owner_name, organization_name, organization_display_name, organization_icon, organization_description, template_name, template_display_name, template_icon, template_description FROM workspaces_expanded as workspaces WHERE @@ -18353,6 +18357,7 @@ func (q *sqlQuerier) GetWorkspaceByWorkspaceAppID(ctx context.Context, workspace &i.NextStartAt, &i.OwnerAvatarUrl, &i.OwnerUsername, + &i.OwnerName, &i.OrganizationName, &i.OrganizationDisplayName, &i.OrganizationIcon, @@ -18410,7 +18415,7 @@ SELECT ), filtered_workspaces AS ( SELECT - workspaces.id, workspaces.created_at, workspaces.updated_at, workspaces.owner_id, workspaces.organization_id, workspaces.template_id, workspaces.deleted, workspaces.name, workspaces.autostart_schedule, workspaces.ttl, workspaces.last_used_at, workspaces.dormant_at, workspaces.deleting_at, workspaces.automatic_updates, workspaces.favorite, workspaces.next_start_at, workspaces.owner_avatar_url, workspaces.owner_username, workspaces.organization_name, workspaces.organization_display_name, workspaces.organization_icon, workspaces.organization_description, workspaces.template_name, workspaces.template_display_name, workspaces.template_icon, workspaces.template_description, + workspaces.id, workspaces.created_at, workspaces.updated_at, workspaces.owner_id, workspaces.organization_id, workspaces.template_id, workspaces.deleted, workspaces.name, workspaces.autostart_schedule, workspaces.ttl, workspaces.last_used_at, workspaces.dormant_at, workspaces.deleting_at, workspaces.automatic_updates, workspaces.favorite, workspaces.next_start_at, workspaces.owner_avatar_url, workspaces.owner_username, workspaces.owner_name, workspaces.organization_name, workspaces.organization_display_name, workspaces.organization_icon, workspaces.organization_description, workspaces.template_name, workspaces.template_display_name, workspaces.template_icon, workspaces.template_description, latest_build.template_version_id, latest_build.template_version_name, latest_build.completed_at as latest_build_completed_at, @@ -18650,7 +18655,7 @@ WHERE -- @authorize_filter ), filtered_workspaces_order AS ( SELECT - fw.id, fw.created_at, fw.updated_at, fw.owner_id, fw.organization_id, fw.template_id, fw.deleted, fw.name, fw.autostart_schedule, fw.ttl, fw.last_used_at, fw.dormant_at, fw.deleting_at, fw.automatic_updates, fw.favorite, fw.next_start_at, fw.owner_avatar_url, fw.owner_username, fw.organization_name, fw.organization_display_name, fw.organization_icon, fw.organization_description, fw.template_name, fw.template_display_name, fw.template_icon, fw.template_description, fw.template_version_id, fw.template_version_name, fw.latest_build_completed_at, fw.latest_build_canceled_at, fw.latest_build_error, fw.latest_build_transition, fw.latest_build_status + fw.id, fw.created_at, fw.updated_at, fw.owner_id, fw.organization_id, fw.template_id, fw.deleted, fw.name, fw.autostart_schedule, fw.ttl, fw.last_used_at, fw.dormant_at, fw.deleting_at, fw.automatic_updates, fw.favorite, fw.next_start_at, fw.owner_avatar_url, fw.owner_username, fw.owner_name, fw.organization_name, fw.organization_display_name, fw.organization_icon, fw.organization_description, fw.template_name, fw.template_display_name, fw.template_icon, fw.template_description, fw.template_version_id, fw.template_version_name, fw.latest_build_completed_at, fw.latest_build_canceled_at, fw.latest_build_error, fw.latest_build_transition, fw.latest_build_status FROM filtered_workspaces fw ORDER BY @@ -18671,7 +18676,7 @@ WHERE $20 ), filtered_workspaces_order_with_summary AS ( SELECT - fwo.id, fwo.created_at, fwo.updated_at, fwo.owner_id, fwo.organization_id, fwo.template_id, fwo.deleted, fwo.name, fwo.autostart_schedule, fwo.ttl, fwo.last_used_at, fwo.dormant_at, fwo.deleting_at, fwo.automatic_updates, fwo.favorite, fwo.next_start_at, fwo.owner_avatar_url, fwo.owner_username, fwo.organization_name, fwo.organization_display_name, fwo.organization_icon, fwo.organization_description, fwo.template_name, fwo.template_display_name, fwo.template_icon, fwo.template_description, fwo.template_version_id, fwo.template_version_name, fwo.latest_build_completed_at, fwo.latest_build_canceled_at, fwo.latest_build_error, fwo.latest_build_transition, fwo.latest_build_status + fwo.id, fwo.created_at, fwo.updated_at, fwo.owner_id, fwo.organization_id, fwo.template_id, fwo.deleted, fwo.name, fwo.autostart_schedule, fwo.ttl, fwo.last_used_at, fwo.dormant_at, fwo.deleting_at, fwo.automatic_updates, fwo.favorite, fwo.next_start_at, fwo.owner_avatar_url, fwo.owner_username, fwo.owner_name, fwo.organization_name, fwo.organization_display_name, fwo.organization_icon, fwo.organization_description, fwo.template_name, fwo.template_display_name, fwo.template_icon, fwo.template_description, fwo.template_version_id, fwo.template_version_name, fwo.latest_build_completed_at, fwo.latest_build_canceled_at, fwo.latest_build_error, fwo.latest_build_transition, fwo.latest_build_status FROM filtered_workspaces_order fwo -- Return a technical summary row with total count of workspaces. @@ -18696,6 +18701,7 @@ WHERE '0001-01-01 00:00:00+00'::timestamptz, -- next_start_at '', -- owner_avatar_url '', -- owner_username + '', -- owner_name '', -- organization_name '', -- organization_display_name '', -- organization_icon @@ -18721,7 +18727,7 @@ WHERE filtered_workspaces ) SELECT - fwos.id, fwos.created_at, fwos.updated_at, fwos.owner_id, fwos.organization_id, fwos.template_id, fwos.deleted, fwos.name, fwos.autostart_schedule, fwos.ttl, fwos.last_used_at, fwos.dormant_at, fwos.deleting_at, fwos.automatic_updates, fwos.favorite, fwos.next_start_at, fwos.owner_avatar_url, fwos.owner_username, fwos.organization_name, fwos.organization_display_name, fwos.organization_icon, fwos.organization_description, fwos.template_name, fwos.template_display_name, fwos.template_icon, fwos.template_description, fwos.template_version_id, fwos.template_version_name, fwos.latest_build_completed_at, fwos.latest_build_canceled_at, fwos.latest_build_error, fwos.latest_build_transition, fwos.latest_build_status, + fwos.id, fwos.created_at, fwos.updated_at, fwos.owner_id, fwos.organization_id, fwos.template_id, fwos.deleted, fwos.name, fwos.autostart_schedule, fwos.ttl, fwos.last_used_at, fwos.dormant_at, fwos.deleting_at, fwos.automatic_updates, fwos.favorite, fwos.next_start_at, fwos.owner_avatar_url, fwos.owner_username, fwos.owner_name, fwos.organization_name, fwos.organization_display_name, fwos.organization_icon, fwos.organization_description, fwos.template_name, fwos.template_display_name, fwos.template_icon, fwos.template_description, fwos.template_version_id, fwos.template_version_name, fwos.latest_build_completed_at, fwos.latest_build_canceled_at, fwos.latest_build_error, fwos.latest_build_transition, fwos.latest_build_status, tc.count FROM filtered_workspaces_order_with_summary fwos @@ -18773,6 +18779,7 @@ type GetWorkspacesRow struct { NextStartAt sql.NullTime `db:"next_start_at" json:"next_start_at"` OwnerAvatarUrl string `db:"owner_avatar_url" json:"owner_avatar_url"` OwnerUsername string `db:"owner_username" json:"owner_username"` + OwnerName string `db:"owner_name" json:"owner_name"` OrganizationName string `db:"organization_name" json:"organization_name"` OrganizationDisplayName string `db:"organization_display_name" json:"organization_display_name"` OrganizationIcon string `db:"organization_icon" json:"organization_icon"` @@ -18845,6 +18852,7 @@ func (q *sqlQuerier) GetWorkspaces(ctx context.Context, arg GetWorkspacesParams) &i.NextStartAt, &i.OwnerAvatarUrl, &i.OwnerUsername, + &i.OwnerName, &i.OrganizationName, &i.OrganizationDisplayName, &i.OrganizationIcon, diff --git a/coderd/database/queries/workspaces.sql b/coderd/database/queries/workspaces.sql index 44b7dcbf0387d..d439ae2aa9944 100644 --- a/coderd/database/queries/workspaces.sql +++ b/coderd/database/queries/workspaces.sql @@ -395,6 +395,7 @@ WHERE '0001-01-01 00:00:00+00'::timestamptz, -- next_start_at '', -- owner_avatar_url '', -- owner_username + '', -- owner_name '', -- organization_name '', -- organization_display_name '', -- organization_icon diff --git a/coderd/workspacebuilds.go b/coderd/workspacebuilds.go index 08b90b834ccca..1fd0c95ff3a77 100644 --- a/coderd/workspacebuilds.go +++ b/coderd/workspacebuilds.go @@ -1095,7 +1095,8 @@ func (api *API) convertWorkspaceBuild( CreatedAt: build.CreatedAt, UpdatedAt: build.UpdatedAt, WorkspaceOwnerID: workspace.OwnerID, - WorkspaceOwnerName: workspace.OwnerUsername, + WorkspaceOwnerName: workspace.OwnerName, + WorkspaceOwnerUsername: workspace.OwnerUsername, WorkspaceOwnerAvatarURL: workspace.OwnerAvatarUrl, WorkspaceID: build.WorkspaceID, WorkspaceName: workspace.Name, diff --git a/coderd/workspacebuilds_test.go b/coderd/workspacebuilds_test.go index 08a8f3f26e0fa..d9a6baee7b68a 100644 --- a/coderd/workspacebuilds_test.go +++ b/coderd/workspacebuilds_test.go @@ -78,7 +78,8 @@ func TestWorkspaceBuild(t *testing.T) { }, testutil.WaitShort, testutil.IntervalFast) wb, err := client.WorkspaceBuild(testutil.Context(t, testutil.WaitShort), workspace.LatestBuild.ID) require.NoError(t, err) - require.Equal(t, up.Username, wb.WorkspaceOwnerName) + require.Equal(t, up.Username, wb.WorkspaceOwnerUsername) + require.Equal(t, up.Name, wb.WorkspaceOwnerName) require.Equal(t, up.AvatarURL, wb.WorkspaceOwnerAvatarURL) } diff --git a/codersdk/workspacebuilds.go b/codersdk/workspacebuilds.go index ee31876f44fab..dd7af027ae701 100644 --- a/codersdk/workspacebuilds.go +++ b/codersdk/workspacebuilds.go @@ -57,7 +57,8 @@ type WorkspaceBuild struct { WorkspaceID uuid.UUID `json:"workspace_id" format:"uuid"` WorkspaceName string `json:"workspace_name"` WorkspaceOwnerID uuid.UUID `json:"workspace_owner_id" format:"uuid"` - WorkspaceOwnerName string `json:"workspace_owner_name"` + WorkspaceOwnerName string `json:"workspace_owner_name,omitempty"` + WorkspaceOwnerUsername string `json:"workspace_owner_username"` WorkspaceOwnerAvatarURL string `json:"workspace_owner_avatar_url,omitempty"` TemplateVersionID uuid.UUID `json:"template_version_id" format:"uuid"` TemplateVersionName string `json:"template_version_name"` diff --git a/docs/reference/api/builds.md b/docs/reference/api/builds.md index 3cfd25f2a6e0f..a22256d340f1a 100644 --- a/docs/reference/api/builds.md +++ b/docs/reference/api/builds.md @@ -224,7 +224,8 @@ curl -X GET http://coder-server:8080/api/v2/users/{user}/workspace/{workspacenam "workspace_name": "string", "workspace_owner_avatar_url": "string", "workspace_owner_id": "e7078695-5279-4c86-8774-3ac2367a2fc7", - "workspace_owner_name": "string" + "workspace_owner_name": "string", + "workspace_owner_username": "string" } ``` @@ -458,7 +459,8 @@ curl -X GET http://coder-server:8080/api/v2/workspacebuilds/{workspacebuild} \ "workspace_name": "string", "workspace_owner_avatar_url": "string", "workspace_owner_id": "e7078695-5279-4c86-8774-3ac2367a2fc7", - "workspace_owner_name": "string" + "workspace_owner_name": "string", + "workspace_owner_username": "string" } ``` @@ -1169,7 +1171,8 @@ curl -X GET http://coder-server:8080/api/v2/workspacebuilds/{workspacebuild}/sta "workspace_name": "string", "workspace_owner_avatar_url": "string", "workspace_owner_id": "e7078695-5279-4c86-8774-3ac2367a2fc7", - "workspace_owner_name": "string" + "workspace_owner_name": "string", + "workspace_owner_username": "string" } ``` @@ -1476,7 +1479,8 @@ curl -X GET http://coder-server:8080/api/v2/workspaces/{workspace}/builds \ "workspace_name": "string", "workspace_owner_avatar_url": "string", "workspace_owner_id": "e7078695-5279-4c86-8774-3ac2367a2fc7", - "workspace_owner_name": "string" + "workspace_owner_name": "string", + "workspace_owner_username": "string" } ] ``` @@ -1648,6 +1652,7 @@ Status Code **200** | `» workspace_owner_avatar_url` | string | false | | | | `» workspace_owner_id` | string(uuid) | false | | | | `» workspace_owner_name` | string | false | | | +| `» workspace_owner_username` | string | false | | | #### Enumerated Values @@ -1959,7 +1964,8 @@ curl -X POST http://coder-server:8080/api/v2/workspaces/{workspace}/builds \ "workspace_name": "string", "workspace_owner_avatar_url": "string", "workspace_owner_id": "e7078695-5279-4c86-8774-3ac2367a2fc7", - "workspace_owner_name": "string" + "workspace_owner_name": "string", + "workspace_owner_username": "string" } ``` diff --git a/docs/reference/api/schemas.md b/docs/reference/api/schemas.md index 2374c6af8800f..e49dc5996e8e4 100644 --- a/docs/reference/api/schemas.md +++ b/docs/reference/api/schemas.md @@ -8407,7 +8407,8 @@ If the schedule is empty, the user will be updated to use the default schedule.| "workspace_name": "string", "workspace_owner_avatar_url": "string", "workspace_owner_id": "e7078695-5279-4c86-8774-3ac2367a2fc7", - "workspace_owner_name": "string" + "workspace_owner_name": "string", + "workspace_owner_username": "string" }, "name": "string", "next_start_at": "2019-08-24T14:15:22Z", @@ -9374,7 +9375,8 @@ If the schedule is empty, the user will be updated to use the default schedule.| "workspace_name": "string", "workspace_owner_avatar_url": "string", "workspace_owner_id": "e7078695-5279-4c86-8774-3ac2367a2fc7", - "workspace_owner_name": "string" + "workspace_owner_name": "string", + "workspace_owner_username": "string" } ``` @@ -9405,6 +9407,7 @@ If the schedule is empty, the user will be updated to use the default schedule.| | `workspace_owner_avatar_url` | string | false | | | | `workspace_owner_id` | string | false | | | | `workspace_owner_name` | string | false | | | +| `workspace_owner_username` | string | false | | | #### Enumerated Values @@ -10081,7 +10084,8 @@ If the schedule is empty, the user will be updated to use the default schedule.| "workspace_name": "string", "workspace_owner_avatar_url": "string", "workspace_owner_id": "e7078695-5279-4c86-8774-3ac2367a2fc7", - "workspace_owner_name": "string" + "workspace_owner_name": "string", + "workspace_owner_username": "string" }, "name": "string", "next_start_at": "2019-08-24T14:15:22Z", diff --git a/docs/reference/api/workspaces.md b/docs/reference/api/workspaces.md index 241d80ac05f7d..0a0176ee39501 100644 --- a/docs/reference/api/workspaces.md +++ b/docs/reference/api/workspaces.md @@ -279,7 +279,8 @@ of the template will be used. "workspace_name": "string", "workspace_owner_avatar_url": "string", "workspace_owner_id": "e7078695-5279-4c86-8774-3ac2367a2fc7", - "workspace_owner_name": "string" + "workspace_owner_name": "string", + "workspace_owner_username": "string" }, "name": "string", "next_start_at": "2019-08-24T14:15:22Z", @@ -562,7 +563,8 @@ curl -X GET http://coder-server:8080/api/v2/users/{user}/workspace/{workspacenam "workspace_name": "string", "workspace_owner_avatar_url": "string", "workspace_owner_id": "e7078695-5279-4c86-8774-3ac2367a2fc7", - "workspace_owner_name": "string" + "workspace_owner_name": "string", + "workspace_owner_username": "string" }, "name": "string", "next_start_at": "2019-08-24T14:15:22Z", @@ -871,7 +873,8 @@ of the template will be used. "workspace_name": "string", "workspace_owner_avatar_url": "string", "workspace_owner_id": "e7078695-5279-4c86-8774-3ac2367a2fc7", - "workspace_owner_name": "string" + "workspace_owner_name": "string", + "workspace_owner_username": "string" }, "name": "string", "next_start_at": "2019-08-24T14:15:22Z", @@ -1140,7 +1143,8 @@ curl -X GET http://coder-server:8080/api/v2/workspaces \ "workspace_name": "string", "workspace_owner_avatar_url": "string", "workspace_owner_id": "e7078695-5279-4c86-8774-3ac2367a2fc7", - "workspace_owner_name": "string" + "workspace_owner_name": "string", + "workspace_owner_username": "string" }, "name": "string", "next_start_at": "2019-08-24T14:15:22Z", @@ -1424,7 +1428,8 @@ curl -X GET http://coder-server:8080/api/v2/workspaces/{workspace} \ "workspace_name": "string", "workspace_owner_avatar_url": "string", "workspace_owner_id": "e7078695-5279-4c86-8774-3ac2367a2fc7", - "workspace_owner_name": "string" + "workspace_owner_name": "string", + "workspace_owner_username": "string" }, "name": "string", "next_start_at": "2019-08-24T14:15:22Z", @@ -1823,7 +1828,8 @@ curl -X PUT http://coder-server:8080/api/v2/workspaces/{workspace}/dormant \ "workspace_name": "string", "workspace_owner_avatar_url": "string", "workspace_owner_id": "e7078695-5279-4c86-8774-3ac2367a2fc7", - "workspace_owner_name": "string" + "workspace_owner_name": "string", + "workspace_owner_username": "string" }, "name": "string", "next_start_at": "2019-08-24T14:15:22Z", diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index 74631c2be32fd..6d62c73b65ac1 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -3608,7 +3608,8 @@ export interface WorkspaceBuild { readonly workspace_id: string; readonly workspace_name: string; readonly workspace_owner_id: string; - readonly workspace_owner_name: string; + readonly workspace_owner_name?: string; + readonly workspace_owner_username: string; readonly workspace_owner_avatar_url?: string; readonly template_version_id: string; readonly template_version_name: string; From c35f49717f7204f5591b7bb0275f00e0147b004c Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Sun, 25 May 2025 17:28:35 +0000 Subject: [PATCH 2/8] Fix golden file and dbmem --- cli/testdata/coder_list_--output_json.golden | 1 - coderd/database/dbmem/dbmem.go | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cli/testdata/coder_list_--output_json.golden b/cli/testdata/coder_list_--output_json.golden index 225ad049630dd..d8e6a306cabcf 100644 --- a/cli/testdata/coder_list_--output_json.golden +++ b/cli/testdata/coder_list_--output_json.golden @@ -23,7 +23,6 @@ "workspace_id": "===========[workspace ID]===========", "workspace_name": "test-workspace", "workspace_owner_id": "==========[first user ID]===========", - "workspace_owner_name": "testuser", "workspace_owner_username": "testuser", "template_version_id": "============[version ID]============", "template_version_name": "===========[version name]===========", diff --git a/coderd/database/dbmem/dbmem.go b/coderd/database/dbmem/dbmem.go index 1a1455d83045b..a13dd33466bf6 100644 --- a/coderd/database/dbmem/dbmem.go +++ b/coderd/database/dbmem/dbmem.go @@ -531,6 +531,7 @@ func (q *FakeQuerier) convertToWorkspaceRowsNoLock(ctx context.Context, workspac OwnerAvatarUrl: extended.OwnerAvatarUrl, OwnerUsername: extended.OwnerUsername, + OwnerName: extended.OwnerName, OrganizationName: extended.OrganizationName, OrganizationDisplayName: extended.OrganizationDisplayName, @@ -628,6 +629,7 @@ func (q *FakeQuerier) extendWorkspace(w database.WorkspaceTable) database.Worksp return u.ID == w.OwnerID }) extended.OwnerUsername = owner.Username + extended.OwnerName = owner.Name extended.OwnerAvatarUrl = owner.AvatarURL return extended From a41c0a79b3099c194684a74c40135c5d3deb479e Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Sun, 25 May 2025 17:32:41 +0000 Subject: [PATCH 3/8] Fix lint --- site/src/api/api.ts | 2 +- site/src/api/queries/workspaces.ts | 12 +++++------- site/src/testHelpers/entities.ts | 8 ++++---- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/site/src/api/api.ts b/site/src/api/api.ts index 9e579c3706de6..efae24bf27db0 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -1166,7 +1166,7 @@ class ApiMethods { ) ) { const { job } = await this.getWorkspaceBuildByNumber( - build.workspace_owner_name, + build.workspace_owner_username, build.workspace_name, build.build_number, ); diff --git a/site/src/api/queries/workspaces.ts b/site/src/api/queries/workspaces.ts index 86417e4f13655..8346fc18e20bb 100644 --- a/site/src/api/queries/workspaces.ts +++ b/site/src/api/queries/workspaces.ts @@ -27,12 +27,10 @@ import { checkAuthorization } from "./authCheck"; import { disabledRefetchOptions } from "./util"; import { workspaceBuildsKey } from "./workspaceBuilds"; -export const workspaceByOwnerAndNameKey = (owner: string, name: string) => [ - "workspace", - owner, - name, - "settings", -]; +export const workspaceByOwnerAndNameKey = ( + ownerUsername: string, + name: string, +) => ["workspace", ownerUsername, name, "settings"]; export const workspaceByOwnerAndName = (owner: string, name: string) => { return { @@ -281,7 +279,7 @@ const updateWorkspaceBuild = async ( queryClient: QueryClient, ) => { const workspaceKey = workspaceByOwnerAndNameKey( - build.workspace_owner_name, + build.workspace_owner_username, build.workspace_name, ); const previousData = queryClient.getQueryData(workspaceKey); diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index 0b0041ffdf18c..0a2c114d109c9 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -1288,7 +1288,7 @@ export const MockWorkspaceBuild: TypesGen.WorkspaceBuild = { updated_at: "2022-05-17T17:39:01.382927298Z", workspace_name: "test-workspace", workspace_owner_id: MockUserOwner.id, - workspace_owner_name: MockUserOwner.username, + workspace_owner_username: MockUserOwner.username, workspace_owner_avatar_url: MockUserOwner.avatar_url, workspace_id: "759f1d46-3174-453d-aa60-980a9c1442f3", deadline: "2022-05-17T23:39:00.00Z", @@ -1316,7 +1316,7 @@ const MockWorkspaceBuildAutostart: TypesGen.WorkspaceBuild = { updated_at: "2022-05-17T17:39:01.382927298Z", workspace_name: "test-workspace", workspace_owner_id: MockUserOwner.id, - workspace_owner_name: MockUserOwner.username, + workspace_owner_username: MockUserOwner.username, workspace_owner_avatar_url: MockUserOwner.avatar_url, workspace_id: "759f1d46-3174-453d-aa60-980a9c1442f3", deadline: "2022-05-17T23:39:00.00Z", @@ -1340,7 +1340,7 @@ const MockWorkspaceBuildAutostop: TypesGen.WorkspaceBuild = { updated_at: "2022-05-17T17:39:01.382927298Z", workspace_name: "test-workspace", workspace_owner_id: MockUserOwner.id, - workspace_owner_name: MockUserOwner.username, + workspace_owner_username: MockUserOwner.username, workspace_owner_avatar_url: MockUserOwner.avatar_url, workspace_id: "759f1d46-3174-453d-aa60-980a9c1442f3", deadline: "2022-05-17T23:39:00.00Z", @@ -1366,7 +1366,7 @@ export const MockFailedWorkspaceBuild = ( updated_at: "2022-05-17T17:39:01.382927298Z", workspace_name: "test-workspace", workspace_owner_id: MockUserOwner.id, - workspace_owner_name: MockUserOwner.username, + workspace_owner_username: MockUserOwner.username, workspace_owner_avatar_url: MockUserOwner.avatar_url, workspace_id: "759f1d46-3174-453d-aa60-980a9c1442f3", deadline: "2022-05-17T23:39:00.00Z", From 5a5ca80b00937e5619c021659298dfada6be4d01 Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Sun, 25 May 2025 18:56:53 +0000 Subject: [PATCH 4/8] Fix down --- ...workspace_with_correct_owner_names.down.sql | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/coderd/database/migrations/000330_workspace_with_correct_owner_names.down.sql b/coderd/database/migrations/000330_workspace_with_correct_owner_names.down.sql index 2792c5a1d6666..618d2692f3076 100644 --- a/coderd/database/migrations/000330_workspace_with_correct_owner_names.down.sql +++ b/coderd/database/migrations/000330_workspace_with_correct_owner_names.down.sql @@ -33,15 +33,6 @@ FROM ( COMMENT ON VIEW template_version_with_user IS 'Joins in the username + avatar url of the created by user.'; --- Recreate `visible_users` as described in dump.sql -DROP VIEW visible_users; - -CREATE VIEW visible_users AS -SELECT users.id, users.username, users.avatar_url -FROM users; - -COMMENT ON VIEW visible_users IS 'Visible fields of users are allowed to be joined with other tables for including context of other resources.'; - -- Recreate `workspace_build_with_user` as described in dump.sql DROP VIEW workspace_build_with_user; @@ -239,3 +230,12 @@ FROM ( ); COMMENT ON VIEW template_version_with_user IS 'Joins in the username + avatar url of the created by user.'; + +-- Recreate `visible_users` as described in dump.sql +DROP VIEW visible_users; + +CREATE VIEW visible_users AS +SELECT users.id, users.username, users.avatar_url +FROM users; + +COMMENT ON VIEW visible_users IS 'Visible fields of users are allowed to be joined with other tables for including context of other resources.'; From aba62bf53507eb1ff4ffa853d76432c1ccbc3d1f Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Sun, 25 May 2025 19:12:09 +0000 Subject: [PATCH 5/8] Fix migration down --- ...orkspace_with_correct_owner_names.down.sql | 166 +++++++----------- 1 file changed, 67 insertions(+), 99 deletions(-) diff --git a/coderd/database/migrations/000330_workspace_with_correct_owner_names.down.sql b/coderd/database/migrations/000330_workspace_with_correct_owner_names.down.sql index 618d2692f3076..ec7bd37266c00 100644 --- a/coderd/database/migrations/000330_workspace_with_correct_owner_names.down.sql +++ b/coderd/database/migrations/000330_workspace_with_correct_owner_names.down.sql @@ -1,40 +1,22 @@ --- Recreate `template_version_with_user` as described in dump.sql DROP VIEW template_version_with_user; -CREATE VIEW template_version_with_user AS -SELECT - template_versions.id, - template_versions.template_id, - template_versions.organization_id, - template_versions.created_at, - template_versions.updated_at, - template_versions.name, - template_versions.readme, - template_versions.job_id, - template_versions.created_by, - template_versions.external_auth_providers, - template_versions.message, - template_versions.archived, - template_versions.source_example_id, - COALESCE( - visible_users.avatar_url, - ''::text - ) AS created_by_avatar_url, - COALESCE( - visible_users.username, - ''::text - ) AS created_by_username -FROM ( - template_versions - LEFT JOIN visible_users ON ( - template_versions.created_by = visible_users.id - ) - ); +DROP VIEW workspace_build_with_user; -COMMENT ON VIEW template_version_with_user IS 'Joins in the username + avatar url of the created by user.'; +DROP VIEW template_with_names; + +DROP VIEW workspaces_expanded; + +DROP VIEW visible_users; + +-- Recreate `visible_users` as described in dump.sql + +CREATE VIEW visible_users AS +SELECT users.id, users.username, users.avatar_url +FROM users; + +COMMENT ON VIEW visible_users IS 'Visible fields of users are allowed to be joined with other tables for including context of other resources.'; -- Recreate `workspace_build_with_user` as described in dump.sql -DROP VIEW workspace_build_with_user; CREATE VIEW workspace_build_with_user AS SELECT @@ -72,64 +54,7 @@ FROM ( COMMENT ON VIEW workspace_build_with_user IS 'Joins in the username + avatar url of the initiated by user.'; --- Recreate `workspaces_expanded` as described in dump.sql -DROP VIEW workspaces_expanded; - -CREATE VIEW workspaces_expanded AS -SELECT - workspaces.id, - workspaces.created_at, - workspaces.updated_at, - workspaces.owner_id, - workspaces.organization_id, - workspaces.template_id, - workspaces.deleted, - workspaces.name, - workspaces.autostart_schedule, - workspaces.ttl, - workspaces.last_used_at, - workspaces.dormant_at, - workspaces.deleting_at, - workspaces.automatic_updates, - workspaces.favorite, - workspaces.next_start_at, - visible_users.avatar_url AS owner_avatar_url, - visible_users.username AS owner_username, - organizations.name AS organization_name, - organizations.display_name AS organization_display_name, - organizations.icon AS organization_icon, - organizations.description AS organization_description, - templates.name AS template_name, - templates.display_name AS template_display_name, - templates.icon AS template_icon, - templates.description AS template_description -FROM ( - ( - ( - workspaces - JOIN visible_users ON ( - ( - workspaces.owner_id = visible_users.id - ) - ) - ) - JOIN organizations ON ( - ( - workspaces.organization_id = organizations.id - ) - ) - ) - JOIN templates ON ( - ( - workspaces.template_id = templates.id - ) - ) - ); - -COMMENT ON VIEW workspaces_expanded IS 'Joins in the display name information such as username, avatar, and organization name.'; - -- Recreate `template_with_names` as described in dump.sql -DROP VIEW template_with_names; CREATE VIEW template_with_names AS SELECT @@ -195,7 +120,6 @@ FROM ( COMMENT ON VIEW template_with_names IS 'Joins in the display name information such as username, avatar, and organization name.'; -- Recreate `template_version_with_user` as described in dump.sql -DROP VIEW template_version_with_user; CREATE VIEW template_version_with_user AS SELECT @@ -223,19 +147,63 @@ SELECT FROM ( template_versions LEFT JOIN visible_users ON ( - ( - template_versions.created_by = visible_users.id - ) + template_versions.created_by = visible_users.id ) ); COMMENT ON VIEW template_version_with_user IS 'Joins in the username + avatar url of the created by user.'; --- Recreate `visible_users` as described in dump.sql -DROP VIEW visible_users; +-- Recreate `workspaces_expanded` as described in dump.sql -CREATE VIEW visible_users AS -SELECT users.id, users.username, users.avatar_url -FROM users; +CREATE VIEW workspaces_expanded AS +SELECT + workspaces.id, + workspaces.created_at, + workspaces.updated_at, + workspaces.owner_id, + workspaces.organization_id, + workspaces.template_id, + workspaces.deleted, + workspaces.name, + workspaces.autostart_schedule, + workspaces.ttl, + workspaces.last_used_at, + workspaces.dormant_at, + workspaces.deleting_at, + workspaces.automatic_updates, + workspaces.favorite, + workspaces.next_start_at, + visible_users.avatar_url AS owner_avatar_url, + visible_users.username AS owner_username, + organizations.name AS organization_name, + organizations.display_name AS organization_display_name, + organizations.icon AS organization_icon, + organizations.description AS organization_description, + templates.name AS template_name, + templates.display_name AS template_display_name, + templates.icon AS template_icon, + templates.description AS template_description +FROM ( + ( + ( + workspaces + JOIN visible_users ON ( + ( + workspaces.owner_id = visible_users.id + ) + ) + ) + JOIN organizations ON ( + ( + workspaces.organization_id = organizations.id + ) + ) + ) + JOIN templates ON ( + ( + workspaces.template_id = templates.id + ) + ) + ); -COMMENT ON VIEW visible_users IS 'Visible fields of users are allowed to be joined with other tables for including context of other resources.'; +COMMENT ON VIEW workspaces_expanded IS 'Joins in the display name information such as username, avatar, and organization name.'; From 50dd8c38da086d1293d063ed38e09d4949315b34 Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Sun, 25 May 2025 19:53:05 +0000 Subject: [PATCH 6/8] Fix build page view --- site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx index f35b5b8465425..8b1f0737f889c 100644 --- a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx +++ b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx @@ -205,7 +205,7 @@ export const WorkspaceBuildPageView: FC = ({ fontWeight: 600, }} > - {`coder rm ${`${build.workspace_owner_name}/${build.workspace_name}`} --orphan`} + {`coder rm ${`${build.workspace_owner_username}/${build.workspace_name}`} --orphan`} {" "} to delete the workspace skipping resource destruction. From 9d5f6d84a13b4a9725334d9d30b2ef881c346d37 Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Tue, 27 May 2025 13:59:55 +0000 Subject: [PATCH 7/8] Add name in missing parts --- .../000330_workspace_with_correct_owner_names.up.sql | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/coderd/database/migrations/000330_workspace_with_correct_owner_names.up.sql b/coderd/database/migrations/000330_workspace_with_correct_owner_names.up.sql index 86e51f5467a2a..a38d77d499ee6 100644 --- a/coderd/database/migrations/000330_workspace_with_correct_owner_names.up.sql +++ b/coderd/database/migrations/000330_workspace_with_correct_owner_names.up.sql @@ -40,7 +40,7 @@ SELECT COALESCE( visible_users.username, ''::text - ) AS initiator_by_username + ) AS initiator_by_username COALESCE(visible_users.name, ''::text) AS initiator_by_name FROM ( workspace_builds LEFT JOIN visible_users ON ( @@ -92,6 +92,7 @@ SELECT visible_users.username, ''::text ) AS created_by_username, + COALESCE(visible_users.name, ''::text) AS created_by_name, COALESCE(organizations.name, ''::text) AS organization_name, COALESCE( organizations.display_name, @@ -139,7 +140,7 @@ SELECT COALESCE( visible_users.username, ''::text - ) AS created_by_username + ) AS created_by_username COALESCE(visible_users.name, ''::text) AS created_by_name FROM ( template_versions LEFT JOIN visible_users ON ( From 761d977a043faea6027fe176c2acd959db1f7dbb Mon Sep 17 00:00:00 2001 From: BrunoQuaresma Date: Tue, 27 May 2025 14:28:52 +0000 Subject: [PATCH 8/8] Fix make gen --- coderd/database/dump.sql | 7 ++- ..._workspace_with_correct_owner_names.up.sql | 6 +- coderd/database/modelqueries.go | 1 + coderd/database/models.go | 3 + coderd/database/queries.sql.go | 63 ++++++++++++------- docs/admin/security/audit-logs.md | 52 +++++++-------- enterprise/audit/table.go | 3 + 7 files changed, 84 insertions(+), 51 deletions(-) diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index f55aab86f042e..5e79149ff6f52 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -1528,7 +1528,8 @@ CREATE VIEW template_version_with_user AS template_versions.archived, template_versions.source_example_id, COALESCE(visible_users.avatar_url, ''::text) AS created_by_avatar_url, - COALESCE(visible_users.username, ''::text) AS created_by_username + COALESCE(visible_users.username, ''::text) AS created_by_username, + COALESCE(visible_users.name, ''::text) AS created_by_name FROM (template_versions LEFT JOIN visible_users ON ((template_versions.created_by = visible_users.id))); @@ -1624,6 +1625,7 @@ CREATE VIEW template_with_names AS templates.use_classic_parameter_flow, COALESCE(visible_users.avatar_url, ''::text) AS created_by_avatar_url, COALESCE(visible_users.username, ''::text) AS created_by_username, + COALESCE(visible_users.name, ''::text) AS created_by_name, COALESCE(organizations.name, ''::text) AS organization_name, COALESCE(organizations.display_name, ''::text) AS organization_display_name, COALESCE(organizations.icon, ''::text) AS organization_icon @@ -2041,7 +2043,8 @@ CREATE VIEW workspace_build_with_user AS workspace_builds.max_deadline, workspace_builds.template_version_preset_id, COALESCE(visible_users.avatar_url, ''::text) AS initiator_by_avatar_url, - COALESCE(visible_users.username, ''::text) AS initiator_by_username + COALESCE(visible_users.username, ''::text) AS initiator_by_username, + COALESCE(visible_users.name, ''::text) AS initiator_by_name FROM (workspace_builds LEFT JOIN visible_users ON ((workspace_builds.initiator_id = visible_users.id))); diff --git a/coderd/database/migrations/000330_workspace_with_correct_owner_names.up.sql b/coderd/database/migrations/000330_workspace_with_correct_owner_names.up.sql index a38d77d499ee6..0374ef335a138 100644 --- a/coderd/database/migrations/000330_workspace_with_correct_owner_names.up.sql +++ b/coderd/database/migrations/000330_workspace_with_correct_owner_names.up.sql @@ -40,7 +40,8 @@ SELECT COALESCE( visible_users.username, ''::text - ) AS initiator_by_username COALESCE(visible_users.name, ''::text) AS initiator_by_name + ) AS initiator_by_username, + COALESCE(visible_users.name, ''::text) AS initiator_by_name FROM ( workspace_builds LEFT JOIN visible_users ON ( @@ -140,7 +141,8 @@ SELECT COALESCE( visible_users.username, ''::text - ) AS created_by_username COALESCE(visible_users.name, ''::text) AS created_by_name + ) AS created_by_username, + COALESCE(visible_users.name, ''::text) AS created_by_name FROM ( template_versions LEFT JOIN visible_users ON ( diff --git a/coderd/database/modelqueries.go b/coderd/database/modelqueries.go index 1b24090875e2c..1e4d249d8a034 100644 --- a/coderd/database/modelqueries.go +++ b/coderd/database/modelqueries.go @@ -120,6 +120,7 @@ func (q *sqlQuerier) GetAuthorizedTemplates(ctx context.Context, arg GetTemplate &i.UseClassicParameterFlow, &i.CreatedByAvatarURL, &i.CreatedByUsername, + &i.CreatedByName, &i.OrganizationName, &i.OrganizationDisplayName, &i.OrganizationIcon, diff --git a/coderd/database/models.go b/coderd/database/models.go index 522dbf9be95aa..e9f12d3581936 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -3178,6 +3178,7 @@ type Template struct { UseClassicParameterFlow bool `db:"use_classic_parameter_flow" json:"use_classic_parameter_flow"` CreatedByAvatarURL string `db:"created_by_avatar_url" json:"created_by_avatar_url"` CreatedByUsername string `db:"created_by_username" json:"created_by_username"` + CreatedByName string `db:"created_by_name" json:"created_by_name"` OrganizationName string `db:"organization_name" json:"organization_name"` OrganizationDisplayName string `db:"organization_display_name" json:"organization_display_name"` OrganizationIcon string `db:"organization_icon" json:"organization_icon"` @@ -3270,6 +3271,7 @@ type TemplateVersion struct { SourceExampleID sql.NullString `db:"source_example_id" json:"source_example_id"` CreatedByAvatarURL string `db:"created_by_avatar_url" json:"created_by_avatar_url"` CreatedByUsername string `db:"created_by_username" json:"created_by_username"` + CreatedByName string `db:"created_by_name" json:"created_by_name"` } type TemplateVersionParameter struct { @@ -3756,6 +3758,7 @@ type WorkspaceBuild struct { TemplateVersionPresetID uuid.NullUUID `db:"template_version_preset_id" json:"template_version_preset_id"` InitiatorByAvatarUrl string `db:"initiator_by_avatar_url" json:"initiator_by_avatar_url"` InitiatorByUsername string `db:"initiator_by_username" json:"initiator_by_username"` + InitiatorByName string `db:"initiator_by_name" json:"initiator_by_name"` } type WorkspaceBuildParameter struct { diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 59b25575430bd..c95a7a72e1246 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -10620,7 +10620,7 @@ func (q *sqlQuerier) GetTemplateAverageBuildTime(ctx context.Context, arg GetTem const getTemplateByID = `-- name: GetTemplateByID :one SELECT - id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, created_by_avatar_url, created_by_username, organization_name, organization_display_name, organization_icon + id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, created_by_avatar_url, created_by_username, created_by_name, organization_name, organization_display_name, organization_icon FROM template_with_names WHERE @@ -10664,6 +10664,7 @@ func (q *sqlQuerier) GetTemplateByID(ctx context.Context, id uuid.UUID) (Templat &i.UseClassicParameterFlow, &i.CreatedByAvatarURL, &i.CreatedByUsername, + &i.CreatedByName, &i.OrganizationName, &i.OrganizationDisplayName, &i.OrganizationIcon, @@ -10673,7 +10674,7 @@ func (q *sqlQuerier) GetTemplateByID(ctx context.Context, id uuid.UUID) (Templat const getTemplateByOrganizationAndName = `-- name: GetTemplateByOrganizationAndName :one SELECT - id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, created_by_avatar_url, created_by_username, organization_name, organization_display_name, organization_icon + id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, created_by_avatar_url, created_by_username, created_by_name, organization_name, organization_display_name, organization_icon FROM template_with_names AS templates WHERE @@ -10725,6 +10726,7 @@ func (q *sqlQuerier) GetTemplateByOrganizationAndName(ctx context.Context, arg G &i.UseClassicParameterFlow, &i.CreatedByAvatarURL, &i.CreatedByUsername, + &i.CreatedByName, &i.OrganizationName, &i.OrganizationDisplayName, &i.OrganizationIcon, @@ -10733,7 +10735,7 @@ func (q *sqlQuerier) GetTemplateByOrganizationAndName(ctx context.Context, arg G } const getTemplates = `-- name: GetTemplates :many -SELECT id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, created_by_avatar_url, created_by_username, organization_name, organization_display_name, organization_icon FROM template_with_names AS templates +SELECT id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, created_by_avatar_url, created_by_username, created_by_name, organization_name, organization_display_name, organization_icon FROM template_with_names AS templates ORDER BY (name, id) ASC ` @@ -10778,6 +10780,7 @@ func (q *sqlQuerier) GetTemplates(ctx context.Context) ([]Template, error) { &i.UseClassicParameterFlow, &i.CreatedByAvatarURL, &i.CreatedByUsername, + &i.CreatedByName, &i.OrganizationName, &i.OrganizationDisplayName, &i.OrganizationIcon, @@ -10797,7 +10800,7 @@ func (q *sqlQuerier) GetTemplates(ctx context.Context) ([]Template, error) { const getTemplatesWithFilter = `-- name: GetTemplatesWithFilter :many SELECT - id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, created_by_avatar_url, created_by_username, organization_name, organization_display_name, organization_icon + id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, created_by_avatar_url, created_by_username, created_by_name, organization_name, organization_display_name, organization_icon FROM template_with_names AS templates WHERE @@ -10900,6 +10903,7 @@ func (q *sqlQuerier) GetTemplatesWithFilter(ctx context.Context, arg GetTemplate &i.UseClassicParameterFlow, &i.CreatedByAvatarURL, &i.CreatedByUsername, + &i.CreatedByName, &i.OrganizationName, &i.OrganizationDisplayName, &i.OrganizationIcon, @@ -11428,7 +11432,7 @@ func (q *sqlQuerier) ArchiveUnusedTemplateVersions(ctx context.Context, arg Arch const getPreviousTemplateVersion = `-- name: GetPreviousTemplateVersion :one SELECT - id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, external_auth_providers, message, archived, source_example_id, created_by_avatar_url, created_by_username + id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, external_auth_providers, message, archived, source_example_id, created_by_avatar_url, created_by_username, created_by_name FROM template_version_with_user AS template_versions WHERE @@ -11468,13 +11472,14 @@ func (q *sqlQuerier) GetPreviousTemplateVersion(ctx context.Context, arg GetPrev &i.SourceExampleID, &i.CreatedByAvatarURL, &i.CreatedByUsername, + &i.CreatedByName, ) return i, err } const getTemplateVersionByID = `-- name: GetTemplateVersionByID :one SELECT - id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, external_auth_providers, message, archived, source_example_id, created_by_avatar_url, created_by_username + id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, external_auth_providers, message, archived, source_example_id, created_by_avatar_url, created_by_username, created_by_name FROM template_version_with_user AS template_versions WHERE @@ -11500,13 +11505,14 @@ func (q *sqlQuerier) GetTemplateVersionByID(ctx context.Context, id uuid.UUID) ( &i.SourceExampleID, &i.CreatedByAvatarURL, &i.CreatedByUsername, + &i.CreatedByName, ) return i, err } const getTemplateVersionByJobID = `-- name: GetTemplateVersionByJobID :one SELECT - id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, external_auth_providers, message, archived, source_example_id, created_by_avatar_url, created_by_username + id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, external_auth_providers, message, archived, source_example_id, created_by_avatar_url, created_by_username, created_by_name FROM template_version_with_user AS template_versions WHERE @@ -11532,13 +11538,14 @@ func (q *sqlQuerier) GetTemplateVersionByJobID(ctx context.Context, jobID uuid.U &i.SourceExampleID, &i.CreatedByAvatarURL, &i.CreatedByUsername, + &i.CreatedByName, ) return i, err } const getTemplateVersionByTemplateIDAndName = `-- name: GetTemplateVersionByTemplateIDAndName :one SELECT - id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, external_auth_providers, message, archived, source_example_id, created_by_avatar_url, created_by_username + id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, external_auth_providers, message, archived, source_example_id, created_by_avatar_url, created_by_username, created_by_name FROM template_version_with_user AS template_versions WHERE @@ -11570,13 +11577,14 @@ func (q *sqlQuerier) GetTemplateVersionByTemplateIDAndName(ctx context.Context, &i.SourceExampleID, &i.CreatedByAvatarURL, &i.CreatedByUsername, + &i.CreatedByName, ) return i, err } const getTemplateVersionsByIDs = `-- name: GetTemplateVersionsByIDs :many SELECT - id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, external_auth_providers, message, archived, source_example_id, created_by_avatar_url, created_by_username + id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, external_auth_providers, message, archived, source_example_id, created_by_avatar_url, created_by_username, created_by_name FROM template_version_with_user AS template_versions WHERE @@ -11608,6 +11616,7 @@ func (q *sqlQuerier) GetTemplateVersionsByIDs(ctx context.Context, ids []uuid.UU &i.SourceExampleID, &i.CreatedByAvatarURL, &i.CreatedByUsername, + &i.CreatedByName, ); err != nil { return nil, err } @@ -11624,7 +11633,7 @@ func (q *sqlQuerier) GetTemplateVersionsByIDs(ctx context.Context, ids []uuid.UU const getTemplateVersionsByTemplateID = `-- name: GetTemplateVersionsByTemplateID :many SELECT - id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, external_auth_providers, message, archived, source_example_id, created_by_avatar_url, created_by_username + id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, external_auth_providers, message, archived, source_example_id, created_by_avatar_url, created_by_username, created_by_name FROM template_version_with_user AS template_versions WHERE @@ -11703,6 +11712,7 @@ func (q *sqlQuerier) GetTemplateVersionsByTemplateID(ctx context.Context, arg Ge &i.SourceExampleID, &i.CreatedByAvatarURL, &i.CreatedByUsername, + &i.CreatedByName, ); err != nil { return nil, err } @@ -11718,7 +11728,7 @@ func (q *sqlQuerier) GetTemplateVersionsByTemplateID(ctx context.Context, arg Ge } const getTemplateVersionsCreatedAfter = `-- name: GetTemplateVersionsCreatedAfter :many -SELECT id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, external_auth_providers, message, archived, source_example_id, created_by_avatar_url, created_by_username FROM template_version_with_user AS template_versions WHERE created_at > $1 +SELECT id, template_id, organization_id, created_at, updated_at, name, readme, job_id, created_by, external_auth_providers, message, archived, source_example_id, created_by_avatar_url, created_by_username, created_by_name FROM template_version_with_user AS template_versions WHERE created_at > $1 ` func (q *sqlQuerier) GetTemplateVersionsCreatedAfter(ctx context.Context, createdAt time.Time) ([]TemplateVersion, error) { @@ -11746,6 +11756,7 @@ func (q *sqlQuerier) GetTemplateVersionsCreatedAfter(ctx context.Context, create &i.SourceExampleID, &i.CreatedByAvatarURL, &i.CreatedByUsername, + &i.CreatedByName, ); err != nil { return nil, err } @@ -14140,7 +14151,7 @@ const getWorkspaceAgentAndLatestBuildByAuthToken = `-- name: GetWorkspaceAgentAn SELECT workspaces.id, workspaces.created_at, workspaces.updated_at, workspaces.owner_id, workspaces.organization_id, workspaces.template_id, workspaces.deleted, workspaces.name, workspaces.autostart_schedule, workspaces.ttl, workspaces.last_used_at, workspaces.dormant_at, workspaces.deleting_at, workspaces.automatic_updates, workspaces.favorite, workspaces.next_start_at, workspace_agents.id, workspace_agents.created_at, workspace_agents.updated_at, workspace_agents.name, workspace_agents.first_connected_at, workspace_agents.last_connected_at, workspace_agents.disconnected_at, workspace_agents.resource_id, workspace_agents.auth_token, workspace_agents.auth_instance_id, workspace_agents.architecture, workspace_agents.environment_variables, workspace_agents.operating_system, workspace_agents.instance_metadata, workspace_agents.resource_metadata, workspace_agents.directory, workspace_agents.version, workspace_agents.last_connected_replica_id, workspace_agents.connection_timeout_seconds, workspace_agents.troubleshooting_url, workspace_agents.motd_file, workspace_agents.lifecycle_state, workspace_agents.expanded_directory, workspace_agents.logs_length, workspace_agents.logs_overflowed, workspace_agents.started_at, workspace_agents.ready_at, workspace_agents.subsystems, workspace_agents.display_apps, workspace_agents.api_version, workspace_agents.display_order, workspace_agents.parent_id, workspace_agents.api_key_scope, - workspace_build_with_user.id, workspace_build_with_user.created_at, workspace_build_with_user.updated_at, workspace_build_with_user.workspace_id, workspace_build_with_user.template_version_id, workspace_build_with_user.build_number, workspace_build_with_user.transition, workspace_build_with_user.initiator_id, workspace_build_with_user.provisioner_state, workspace_build_with_user.job_id, workspace_build_with_user.deadline, workspace_build_with_user.reason, workspace_build_with_user.daily_cost, workspace_build_with_user.max_deadline, workspace_build_with_user.template_version_preset_id, workspace_build_with_user.initiator_by_avatar_url, workspace_build_with_user.initiator_by_username + workspace_build_with_user.id, workspace_build_with_user.created_at, workspace_build_with_user.updated_at, workspace_build_with_user.workspace_id, workspace_build_with_user.template_version_id, workspace_build_with_user.build_number, workspace_build_with_user.transition, workspace_build_with_user.initiator_id, workspace_build_with_user.provisioner_state, workspace_build_with_user.job_id, workspace_build_with_user.deadline, workspace_build_with_user.reason, workspace_build_with_user.daily_cost, workspace_build_with_user.max_deadline, workspace_build_with_user.template_version_preset_id, workspace_build_with_user.initiator_by_avatar_url, workspace_build_with_user.initiator_by_username, workspace_build_with_user.initiator_by_name FROM workspace_agents JOIN @@ -14248,6 +14259,7 @@ func (q *sqlQuerier) GetWorkspaceAgentAndLatestBuildByAuthToken(ctx context.Cont &i.WorkspaceBuild.TemplateVersionPresetID, &i.WorkspaceBuild.InitiatorByAvatarUrl, &i.WorkspaceBuild.InitiatorByUsername, + &i.WorkspaceBuild.InitiatorByName, ) return i, err } @@ -16745,7 +16757,7 @@ func (q *sqlQuerier) InsertWorkspaceBuildParameters(ctx context.Context, arg Ins } const getActiveWorkspaceBuildsByTemplateID = `-- name: GetActiveWorkspaceBuildsByTemplateID :many -SELECT wb.id, wb.created_at, wb.updated_at, wb.workspace_id, wb.template_version_id, wb.build_number, wb.transition, wb.initiator_id, wb.provisioner_state, wb.job_id, wb.deadline, wb.reason, wb.daily_cost, wb.max_deadline, wb.template_version_preset_id, wb.initiator_by_avatar_url, wb.initiator_by_username +SELECT wb.id, wb.created_at, wb.updated_at, wb.workspace_id, wb.template_version_id, wb.build_number, wb.transition, wb.initiator_id, wb.provisioner_state, wb.job_id, wb.deadline, wb.reason, wb.daily_cost, wb.max_deadline, wb.template_version_preset_id, wb.initiator_by_avatar_url, wb.initiator_by_username, wb.initiator_by_name FROM ( SELECT workspace_id, MAX(build_number) as max_build_number @@ -16802,6 +16814,7 @@ func (q *sqlQuerier) GetActiveWorkspaceBuildsByTemplateID(ctx context.Context, t &i.TemplateVersionPresetID, &i.InitiatorByAvatarUrl, &i.InitiatorByUsername, + &i.InitiatorByName, ); err != nil { return nil, err } @@ -16898,7 +16911,7 @@ func (q *sqlQuerier) GetFailedWorkspaceBuildsByTemplateID(ctx context.Context, a const getLatestWorkspaceBuildByWorkspaceID = `-- name: GetLatestWorkspaceBuildByWorkspaceID :one SELECT - id, created_at, updated_at, workspace_id, template_version_id, build_number, transition, initiator_id, provisioner_state, job_id, deadline, reason, daily_cost, max_deadline, template_version_preset_id, initiator_by_avatar_url, initiator_by_username + id, created_at, updated_at, workspace_id, template_version_id, build_number, transition, initiator_id, provisioner_state, job_id, deadline, reason, daily_cost, max_deadline, template_version_preset_id, initiator_by_avatar_url, initiator_by_username, initiator_by_name FROM workspace_build_with_user AS workspace_builds WHERE @@ -16930,12 +16943,13 @@ func (q *sqlQuerier) GetLatestWorkspaceBuildByWorkspaceID(ctx context.Context, w &i.TemplateVersionPresetID, &i.InitiatorByAvatarUrl, &i.InitiatorByUsername, + &i.InitiatorByName, ) return i, err } const getLatestWorkspaceBuilds = `-- name: GetLatestWorkspaceBuilds :many -SELECT wb.id, wb.created_at, wb.updated_at, wb.workspace_id, wb.template_version_id, wb.build_number, wb.transition, wb.initiator_id, wb.provisioner_state, wb.job_id, wb.deadline, wb.reason, wb.daily_cost, wb.max_deadline, wb.template_version_preset_id, wb.initiator_by_avatar_url, wb.initiator_by_username +SELECT wb.id, wb.created_at, wb.updated_at, wb.workspace_id, wb.template_version_id, wb.build_number, wb.transition, wb.initiator_id, wb.provisioner_state, wb.job_id, wb.deadline, wb.reason, wb.daily_cost, wb.max_deadline, wb.template_version_preset_id, wb.initiator_by_avatar_url, wb.initiator_by_username, wb.initiator_by_name FROM ( SELECT workspace_id, MAX(build_number) as max_build_number @@ -16976,6 +16990,7 @@ func (q *sqlQuerier) GetLatestWorkspaceBuilds(ctx context.Context) ([]WorkspaceB &i.TemplateVersionPresetID, &i.InitiatorByAvatarUrl, &i.InitiatorByUsername, + &i.InitiatorByName, ); err != nil { return nil, err } @@ -16991,7 +17006,7 @@ func (q *sqlQuerier) GetLatestWorkspaceBuilds(ctx context.Context) ([]WorkspaceB } const getLatestWorkspaceBuildsByWorkspaceIDs = `-- name: GetLatestWorkspaceBuildsByWorkspaceIDs :many -SELECT wb.id, wb.created_at, wb.updated_at, wb.workspace_id, wb.template_version_id, wb.build_number, wb.transition, wb.initiator_id, wb.provisioner_state, wb.job_id, wb.deadline, wb.reason, wb.daily_cost, wb.max_deadline, wb.template_version_preset_id, wb.initiator_by_avatar_url, wb.initiator_by_username +SELECT wb.id, wb.created_at, wb.updated_at, wb.workspace_id, wb.template_version_id, wb.build_number, wb.transition, wb.initiator_id, wb.provisioner_state, wb.job_id, wb.deadline, wb.reason, wb.daily_cost, wb.max_deadline, wb.template_version_preset_id, wb.initiator_by_avatar_url, wb.initiator_by_username, wb.initiator_by_name FROM ( SELECT workspace_id, MAX(build_number) as max_build_number @@ -17034,6 +17049,7 @@ func (q *sqlQuerier) GetLatestWorkspaceBuildsByWorkspaceIDs(ctx context.Context, &i.TemplateVersionPresetID, &i.InitiatorByAvatarUrl, &i.InitiatorByUsername, + &i.InitiatorByName, ); err != nil { return nil, err } @@ -17050,7 +17066,7 @@ func (q *sqlQuerier) GetLatestWorkspaceBuildsByWorkspaceIDs(ctx context.Context, const getWorkspaceBuildByID = `-- name: GetWorkspaceBuildByID :one SELECT - id, created_at, updated_at, workspace_id, template_version_id, build_number, transition, initiator_id, provisioner_state, job_id, deadline, reason, daily_cost, max_deadline, template_version_preset_id, initiator_by_avatar_url, initiator_by_username + id, created_at, updated_at, workspace_id, template_version_id, build_number, transition, initiator_id, provisioner_state, job_id, deadline, reason, daily_cost, max_deadline, template_version_preset_id, initiator_by_avatar_url, initiator_by_username, initiator_by_name FROM workspace_build_with_user AS workspace_builds WHERE @@ -17080,13 +17096,14 @@ func (q *sqlQuerier) GetWorkspaceBuildByID(ctx context.Context, id uuid.UUID) (W &i.TemplateVersionPresetID, &i.InitiatorByAvatarUrl, &i.InitiatorByUsername, + &i.InitiatorByName, ) return i, err } const getWorkspaceBuildByJobID = `-- name: GetWorkspaceBuildByJobID :one SELECT - id, created_at, updated_at, workspace_id, template_version_id, build_number, transition, initiator_id, provisioner_state, job_id, deadline, reason, daily_cost, max_deadline, template_version_preset_id, initiator_by_avatar_url, initiator_by_username + id, created_at, updated_at, workspace_id, template_version_id, build_number, transition, initiator_id, provisioner_state, job_id, deadline, reason, daily_cost, max_deadline, template_version_preset_id, initiator_by_avatar_url, initiator_by_username, initiator_by_name FROM workspace_build_with_user AS workspace_builds WHERE @@ -17116,13 +17133,14 @@ func (q *sqlQuerier) GetWorkspaceBuildByJobID(ctx context.Context, jobID uuid.UU &i.TemplateVersionPresetID, &i.InitiatorByAvatarUrl, &i.InitiatorByUsername, + &i.InitiatorByName, ) return i, err } const getWorkspaceBuildByWorkspaceIDAndBuildNumber = `-- name: GetWorkspaceBuildByWorkspaceIDAndBuildNumber :one SELECT - id, created_at, updated_at, workspace_id, template_version_id, build_number, transition, initiator_id, provisioner_state, job_id, deadline, reason, daily_cost, max_deadline, template_version_preset_id, initiator_by_avatar_url, initiator_by_username + id, created_at, updated_at, workspace_id, template_version_id, build_number, transition, initiator_id, provisioner_state, job_id, deadline, reason, daily_cost, max_deadline, template_version_preset_id, initiator_by_avatar_url, initiator_by_username, initiator_by_name FROM workspace_build_with_user AS workspace_builds WHERE @@ -17156,6 +17174,7 @@ func (q *sqlQuerier) GetWorkspaceBuildByWorkspaceIDAndBuildNumber(ctx context.Co &i.TemplateVersionPresetID, &i.InitiatorByAvatarUrl, &i.InitiatorByUsername, + &i.InitiatorByName, ) return i, err } @@ -17229,7 +17248,7 @@ func (q *sqlQuerier) GetWorkspaceBuildStatsByTemplates(ctx context.Context, sinc const getWorkspaceBuildsByWorkspaceID = `-- name: GetWorkspaceBuildsByWorkspaceID :many SELECT - id, created_at, updated_at, workspace_id, template_version_id, build_number, transition, initiator_id, provisioner_state, job_id, deadline, reason, daily_cost, max_deadline, template_version_preset_id, initiator_by_avatar_url, initiator_by_username + id, created_at, updated_at, workspace_id, template_version_id, build_number, transition, initiator_id, provisioner_state, job_id, deadline, reason, daily_cost, max_deadline, template_version_preset_id, initiator_by_avatar_url, initiator_by_username, initiator_by_name FROM workspace_build_with_user AS workspace_builds WHERE @@ -17302,6 +17321,7 @@ func (q *sqlQuerier) GetWorkspaceBuildsByWorkspaceID(ctx context.Context, arg Ge &i.TemplateVersionPresetID, &i.InitiatorByAvatarUrl, &i.InitiatorByUsername, + &i.InitiatorByName, ); err != nil { return nil, err } @@ -17317,7 +17337,7 @@ func (q *sqlQuerier) GetWorkspaceBuildsByWorkspaceID(ctx context.Context, arg Ge } const getWorkspaceBuildsCreatedAfter = `-- name: GetWorkspaceBuildsCreatedAfter :many -SELECT id, created_at, updated_at, workspace_id, template_version_id, build_number, transition, initiator_id, provisioner_state, job_id, deadline, reason, daily_cost, max_deadline, template_version_preset_id, initiator_by_avatar_url, initiator_by_username FROM workspace_build_with_user WHERE created_at > $1 +SELECT id, created_at, updated_at, workspace_id, template_version_id, build_number, transition, initiator_id, provisioner_state, job_id, deadline, reason, daily_cost, max_deadline, template_version_preset_id, initiator_by_avatar_url, initiator_by_username, initiator_by_name FROM workspace_build_with_user WHERE created_at > $1 ` func (q *sqlQuerier) GetWorkspaceBuildsCreatedAfter(ctx context.Context, createdAt time.Time) ([]WorkspaceBuild, error) { @@ -17347,6 +17367,7 @@ func (q *sqlQuerier) GetWorkspaceBuildsCreatedAfter(ctx context.Context, created &i.TemplateVersionPresetID, &i.InitiatorByAvatarUrl, &i.InitiatorByUsername, + &i.InitiatorByName, ); err != nil { return nil, err } diff --git a/docs/admin/security/audit-logs.md b/docs/admin/security/audit-logs.md index d0b2a46a9d002..c754c532cb841 100644 --- a/docs/admin/security/audit-logs.md +++ b/docs/admin/security/audit-logs.md @@ -8,32 +8,32 @@ We track the following resources: -| Resource | | | -|----------------------------------------------------------|----------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| APIKey
login, logout, register, create, delete | |
FieldTracked
created_attrue
expires_attrue
hashed_secretfalse
idfalse
ip_addressfalse
last_usedtrue
lifetime_secondsfalse
login_typefalse
scopefalse
token_namefalse
updated_atfalse
user_idtrue
| -| AuditOAuthConvertState
| |
FieldTracked
created_attrue
expires_attrue
from_login_typetrue
to_login_typetrue
user_idtrue
| -| Group
create, write, delete | |
FieldTracked
avatar_urltrue
display_nametrue
idtrue
memberstrue
nametrue
organization_idfalse
quota_allowancetrue
sourcefalse
| -| AuditableOrganizationMember
| |
FieldTracked
created_attrue
organization_idfalse
rolestrue
updated_attrue
user_idtrue
usernametrue
| -| CustomRole
| |
FieldTracked
created_atfalse
display_nametrue
idfalse
nametrue
org_permissionstrue
organization_idfalse
site_permissionstrue
updated_atfalse
user_permissionstrue
| -| GitSSHKey
create | |
FieldTracked
created_atfalse
private_keytrue
public_keytrue
updated_atfalse
user_idtrue
| -| GroupSyncSettings
| |
FieldTracked
auto_create_missing_groupstrue
fieldtrue
legacy_group_name_mappingfalse
mappingtrue
regex_filtertrue
| -| HealthSettings
| |
FieldTracked
dismissed_healthcheckstrue
idfalse
| -| License
create, delete | |
FieldTracked
exptrue
idfalse
jwtfalse
uploaded_attrue
uuidtrue
| -| NotificationTemplate
| |
FieldTracked
actionstrue
body_templatetrue
enabled_by_defaulttrue
grouptrue
idfalse
kindtrue
methodtrue
nametrue
title_templatetrue
| -| NotificationsSettings
| |
FieldTracked
idfalse
notifier_pausedtrue
| -| OAuth2ProviderApp
| |
FieldTracked
callback_urltrue
created_atfalse
icontrue
idfalse
nametrue
updated_atfalse
| -| OAuth2ProviderAppSecret
| |
FieldTracked
app_idfalse
created_atfalse
display_secretfalse
hashed_secretfalse
idfalse
last_used_atfalse
secret_prefixfalse
| -| Organization
| |
FieldTracked
created_atfalse
deletedtrue
descriptiontrue
display_nametrue
icontrue
idfalse
is_defaulttrue
nametrue
updated_attrue
| -| OrganizationSyncSettings
| |
FieldTracked
assign_defaulttrue
fieldtrue
mappingtrue
| -| RoleSyncSettings
| |
FieldTracked
fieldtrue
mappingtrue
| -| Template
write, delete | |
FieldTracked
active_version_idtrue
activity_bumptrue
allow_user_autostarttrue
allow_user_autostoptrue
allow_user_cancel_workspace_jobstrue
autostart_block_days_of_weektrue
autostop_requirement_days_of_weektrue
autostop_requirement_weekstrue
created_atfalse
created_bytrue
created_by_avatar_urlfalse
created_by_usernamefalse
default_ttltrue
deletedfalse
deprecatedtrue
descriptiontrue
display_nametrue
failure_ttltrue
group_acltrue
icontrue
idtrue
max_port_sharing_leveltrue
nametrue
organization_display_namefalse
organization_iconfalse
organization_idfalse
organization_namefalse
provisionertrue
require_active_versiontrue
time_til_dormanttrue
time_til_dormant_autodeletetrue
updated_atfalse
use_classic_parameter_flowtrue
user_acltrue
| -| TemplateVersion
create, write | |
FieldTracked
archivedtrue
created_atfalse
created_bytrue
created_by_avatar_urlfalse
created_by_usernamefalse
external_auth_providersfalse
idtrue
job_idfalse
messagefalse
nametrue
organization_idfalse
readmetrue
source_example_idfalse
template_idtrue
updated_atfalse
| -| User
create, write, delete | |
FieldTracked
avatar_urlfalse
created_atfalse
deletedtrue
emailtrue
github_com_user_idfalse
hashed_one_time_passcodefalse
hashed_passwordtrue
idtrue
is_systemtrue
last_seen_atfalse
login_typetrue
nametrue
one_time_passcode_expires_attrue
quiet_hours_scheduletrue
rbac_rolestrue
statustrue
updated_atfalse
usernametrue
| -| WorkspaceAgent
connect, disconnect | |
FieldTracked
api_key_scopefalse
api_versionfalse
architecturefalse
auth_instance_idfalse
auth_tokenfalse
connection_timeout_secondsfalse
created_atfalse
directoryfalse
disconnected_atfalse
display_appsfalse
display_orderfalse
environment_variablesfalse
expanded_directoryfalse
first_connected_atfalse
idfalse
instance_metadatafalse
last_connected_atfalse
last_connected_replica_idfalse
lifecycle_statefalse
logs_lengthfalse
logs_overflowedfalse
motd_filefalse
namefalse
operating_systemfalse
parent_idfalse
ready_atfalse
resource_idfalse
resource_metadatafalse
started_atfalse
subsystemsfalse
troubleshooting_urlfalse
updated_atfalse
versionfalse
| -| WorkspaceApp
open, close | |
FieldTracked
agent_idfalse
commandfalse
created_atfalse
display_namefalse
display_orderfalse
externalfalse
healthfalse
healthcheck_intervalfalse
healthcheck_thresholdfalse
healthcheck_urlfalse
hiddenfalse
iconfalse
idfalse
open_infalse
sharing_levelfalse
slugfalse
subdomainfalse
urlfalse
| -| WorkspaceBuild
start, stop | |
FieldTracked
build_numberfalse
created_atfalse
daily_costfalse
deadlinefalse
idfalse
initiator_by_avatar_urlfalse
initiator_by_usernamefalse
initiator_idfalse
job_idfalse
max_deadlinefalse
provisioner_statefalse
reasonfalse
template_version_idtrue
template_version_preset_idfalse
transitionfalse
updated_atfalse
workspace_idfalse
| -| WorkspaceProxy
| |
FieldTracked
created_attrue
deletedfalse
derp_enabledtrue
derp_onlytrue
display_nametrue
icontrue
idtrue
nametrue
region_idtrue
token_hashed_secrettrue
updated_atfalse
urltrue
versiontrue
wildcard_hostnametrue
| -| WorkspaceTable
| |
FieldTracked
automatic_updatestrue
autostart_scheduletrue
created_atfalse
deletedfalse
deleting_attrue
dormant_attrue
favoritetrue
idtrue
last_used_atfalse
nametrue
next_start_attrue
organization_idfalse
owner_idtrue
template_idtrue
ttltrue
updated_atfalse
| +| Resource | | | +|----------------------------------------------------------|----------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| APIKey
login, logout, register, create, delete | |
FieldTracked
created_attrue
expires_attrue
hashed_secretfalse
idfalse
ip_addressfalse
last_usedtrue
lifetime_secondsfalse
login_typefalse
scopefalse
token_namefalse
updated_atfalse
user_idtrue
| +| AuditOAuthConvertState
| |
FieldTracked
created_attrue
expires_attrue
from_login_typetrue
to_login_typetrue
user_idtrue
| +| Group
create, write, delete | |
FieldTracked
avatar_urltrue
display_nametrue
idtrue
memberstrue
nametrue
organization_idfalse
quota_allowancetrue
sourcefalse
| +| AuditableOrganizationMember
| |
FieldTracked
created_attrue
organization_idfalse
rolestrue
updated_attrue
user_idtrue
usernametrue
| +| CustomRole
| |
FieldTracked
created_atfalse
display_nametrue
idfalse
nametrue
org_permissionstrue
organization_idfalse
site_permissionstrue
updated_atfalse
user_permissionstrue
| +| GitSSHKey
create | |
FieldTracked
created_atfalse
private_keytrue
public_keytrue
updated_atfalse
user_idtrue
| +| GroupSyncSettings
| |
FieldTracked
auto_create_missing_groupstrue
fieldtrue
legacy_group_name_mappingfalse
mappingtrue
regex_filtertrue
| +| HealthSettings
| |
FieldTracked
dismissed_healthcheckstrue
idfalse
| +| License
create, delete | |
FieldTracked
exptrue
idfalse
jwtfalse
uploaded_attrue
uuidtrue
| +| NotificationTemplate
| |
FieldTracked
actionstrue
body_templatetrue
enabled_by_defaulttrue
grouptrue
idfalse
kindtrue
methodtrue
nametrue
title_templatetrue
| +| NotificationsSettings
| |
FieldTracked
idfalse
notifier_pausedtrue
| +| OAuth2ProviderApp
| |
FieldTracked
callback_urltrue
created_atfalse
icontrue
idfalse
nametrue
updated_atfalse
| +| OAuth2ProviderAppSecret
| |
FieldTracked
app_idfalse
created_atfalse
display_secretfalse
hashed_secretfalse
idfalse
last_used_atfalse
secret_prefixfalse
| +| Organization
| |
FieldTracked
created_atfalse
deletedtrue
descriptiontrue
display_nametrue
icontrue
idfalse
is_defaulttrue
nametrue
updated_attrue
| +| OrganizationSyncSettings
| |
FieldTracked
assign_defaulttrue
fieldtrue
mappingtrue
| +| RoleSyncSettings
| |
FieldTracked
fieldtrue
mappingtrue
| +| Template
write, delete | |
FieldTracked
active_version_idtrue
activity_bumptrue
allow_user_autostarttrue
allow_user_autostoptrue
allow_user_cancel_workspace_jobstrue
autostart_block_days_of_weektrue
autostop_requirement_days_of_weektrue
autostop_requirement_weekstrue
created_atfalse
created_bytrue
created_by_avatar_urlfalse
created_by_namefalse
created_by_usernamefalse
default_ttltrue
deletedfalse
deprecatedtrue
descriptiontrue
display_nametrue
failure_ttltrue
group_acltrue
icontrue
idtrue
max_port_sharing_leveltrue
nametrue
organization_display_namefalse
organization_iconfalse
organization_idfalse
organization_namefalse
provisionertrue
require_active_versiontrue
time_til_dormanttrue
time_til_dormant_autodeletetrue
updated_atfalse
use_classic_parameter_flowtrue
user_acltrue
| +| TemplateVersion
create, write | |
FieldTracked
archivedtrue
created_atfalse
created_bytrue
created_by_avatar_urlfalse
created_by_namefalse
created_by_usernamefalse
external_auth_providersfalse
idtrue
job_idfalse
messagefalse
nametrue
organization_idfalse
readmetrue
source_example_idfalse
template_idtrue
updated_atfalse
| +| User
create, write, delete | |
FieldTracked
avatar_urlfalse
created_atfalse
deletedtrue
emailtrue
github_com_user_idfalse
hashed_one_time_passcodefalse
hashed_passwordtrue
idtrue
is_systemtrue
last_seen_atfalse
login_typetrue
nametrue
one_time_passcode_expires_attrue
quiet_hours_scheduletrue
rbac_rolestrue
statustrue
updated_atfalse
usernametrue
| +| WorkspaceAgent
connect, disconnect | |
FieldTracked
api_key_scopefalse
api_versionfalse
architecturefalse
auth_instance_idfalse
auth_tokenfalse
connection_timeout_secondsfalse
created_atfalse
directoryfalse
disconnected_atfalse
display_appsfalse
display_orderfalse
environment_variablesfalse
expanded_directoryfalse
first_connected_atfalse
idfalse
instance_metadatafalse
last_connected_atfalse
last_connected_replica_idfalse
lifecycle_statefalse
logs_lengthfalse
logs_overflowedfalse
motd_filefalse
namefalse
operating_systemfalse
parent_idfalse
ready_atfalse
resource_idfalse
resource_metadatafalse
started_atfalse
subsystemsfalse
troubleshooting_urlfalse
updated_atfalse
versionfalse
| +| WorkspaceApp
open, close | |
FieldTracked
agent_idfalse
commandfalse
created_atfalse
display_namefalse
display_orderfalse
externalfalse
healthfalse
healthcheck_intervalfalse
healthcheck_thresholdfalse
healthcheck_urlfalse
hiddenfalse
iconfalse
idfalse
open_infalse
sharing_levelfalse
slugfalse
subdomainfalse
urlfalse
| +| WorkspaceBuild
start, stop | |
FieldTracked
build_numberfalse
created_atfalse
daily_costfalse
deadlinefalse
idfalse
initiator_by_avatar_urlfalse
initiator_by_namefalse
initiator_by_usernamefalse
initiator_idfalse
job_idfalse
max_deadlinefalse
provisioner_statefalse
reasonfalse
template_version_idtrue
template_version_preset_idfalse
transitionfalse
updated_atfalse
workspace_idfalse
| +| WorkspaceProxy
| |
FieldTracked
created_attrue
deletedfalse
derp_enabledtrue
derp_onlytrue
display_nametrue
icontrue
idtrue
nametrue
region_idtrue
token_hashed_secrettrue
updated_atfalse
urltrue
versiontrue
wildcard_hostnametrue
| +| WorkspaceTable
| |
FieldTracked
automatic_updatestrue
autostart_scheduletrue
created_atfalse
deletedfalse
deleting_attrue
dormant_attrue
favoritetrue
idtrue
last_used_atfalse
nametrue
next_start_attrue
organization_idfalse
owner_idtrue
template_idtrue
ttltrue
updated_atfalse
| diff --git a/enterprise/audit/table.go b/enterprise/audit/table.go index 3c836c9442043..af81a68791c11 100644 --- a/enterprise/audit/table.go +++ b/enterprise/audit/table.go @@ -102,6 +102,7 @@ var auditableResourcesTypes = map[any]map[string]Action{ "autostop_requirement_weeks": ActionTrack, "created_by": ActionTrack, "created_by_username": ActionIgnore, + "created_by_name": ActionIgnore, "created_by_avatar_url": ActionIgnore, "group_acl": ActionTrack, "user_acl": ActionTrack, @@ -131,6 +132,7 @@ var auditableResourcesTypes = map[any]map[string]Action{ "external_auth_providers": ActionIgnore, // Not helpful because this can only change when new versions are added. "created_by_avatar_url": ActionIgnore, "created_by_username": ActionIgnore, + "created_by_name": ActionIgnore, "archived": ActionTrack, "source_example_id": ActionIgnore, // Never changes. }, @@ -189,6 +191,7 @@ var auditableResourcesTypes = map[any]map[string]Action{ "max_deadline": ActionIgnore, "initiator_by_avatar_url": ActionIgnore, "initiator_by_username": ActionIgnore, + "initiator_by_name": ActionIgnore, "template_version_preset_id": ActionIgnore, // Never changes. }, &database.AuditableGroup{}: {