mirror of
https://github.com/coder/coder.git
synced 2026-06-02 20:48:20 +00:00
perf: reduce DB calls to GetWorkspaceByAgentID via caching workspace info (#20662)
--------- Signed-off-by: Callum Styan <callumstyan@gmail.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"encoding/hex"
|
||||
"slices"
|
||||
"sort"
|
||||
@@ -796,3 +797,60 @@ func (s UserSecret) RBACObject() rbac.Object {
|
||||
func (s AIBridgeInterception) RBACObject() rbac.Object {
|
||||
return rbac.ResourceAibridgeInterception.WithOwner(s.InitiatorID.String())
|
||||
}
|
||||
|
||||
// WorkspaceIdentity contains the minimal workspace fields needed for agent API metadata/stats reporting
|
||||
// and RBAC checks, without requiring a full database.Workspace object.
|
||||
type WorkspaceIdentity struct {
|
||||
// Add any other fields needed for IsPrebuild() if it relies on workspace fields
|
||||
// Identity fields
|
||||
ID uuid.UUID
|
||||
OwnerID uuid.UUID
|
||||
OrganizationID uuid.UUID
|
||||
TemplateID uuid.UUID
|
||||
|
||||
// Display fields for logging/metrics
|
||||
Name string
|
||||
OwnerUsername string
|
||||
TemplateName string
|
||||
|
||||
// Lifecycle fields needed for stats reporting
|
||||
AutostartSchedule sql.NullString
|
||||
}
|
||||
|
||||
func (w WorkspaceIdentity) RBACObject() rbac.Object {
|
||||
return Workspace{
|
||||
ID: w.ID,
|
||||
OwnerID: w.OwnerID,
|
||||
OrganizationID: w.OrganizationID,
|
||||
TemplateID: w.TemplateID,
|
||||
Name: w.Name,
|
||||
OwnerUsername: w.OwnerUsername,
|
||||
TemplateName: w.TemplateName,
|
||||
AutostartSchedule: w.AutostartSchedule,
|
||||
}.RBACObject()
|
||||
}
|
||||
|
||||
// IsPrebuild returns true if the workspace is a prebuild workspace.
|
||||
// A workspace is considered a prebuild if its owner is the prebuild system user.
|
||||
func (w WorkspaceIdentity) IsPrebuild() bool {
|
||||
return w.OwnerID == PrebuildsSystemUserID
|
||||
}
|
||||
|
||||
func (w WorkspaceIdentity) Equal(w2 WorkspaceIdentity) bool {
|
||||
return w.ID == w2.ID && w.OwnerID == w2.OwnerID && w.OrganizationID == w2.OrganizationID &&
|
||||
w.TemplateID == w2.TemplateID && w.Name == w2.Name && w.OwnerUsername == w2.OwnerUsername &&
|
||||
w.TemplateName == w2.TemplateName && w.AutostartSchedule == w2.AutostartSchedule
|
||||
}
|
||||
|
||||
func WorkspaceIdentityFromWorkspace(w Workspace) WorkspaceIdentity {
|
||||
return WorkspaceIdentity{
|
||||
ID: w.ID,
|
||||
OwnerID: w.OwnerID,
|
||||
OrganizationID: w.OrganizationID,
|
||||
TemplateID: w.TemplateID,
|
||||
Name: w.Name,
|
||||
OwnerUsername: w.OwnerUsername,
|
||||
TemplateName: w.TemplateName,
|
||||
AutostartSchedule: w.AutostartSchedule,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user