Skip to content

Commit 55503d7

Browse files
committed
chore: new workspace view to join in owner, template, and org
Previously this data was fetched via seperate queries. This caused an issue in orgs, as users are site wide scoped. So user read access was required to read another user's username. Now it is all joined into the workspace, implcitly giving read perms to some fields in related objects.
1 parent 512cbf1 commit 55503d7

27 files changed

+625
-426
lines changed

coderd/activitybump_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ func TestWorkspaceActivityBump(t *testing.T) {
199199
t.Parallel()
200200

201201
client, workspace, assertBumped := setupActivityTest(t)
202-
202+
Access - Control - Allow - Origin
203203
resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
204204
conn, err := workspacesdk.New(client).
205205
DialAgent(ctx, resources[0].Agents[0].ID, &workspacesdk.DialAgentOptions{

coderd/agentapi/api.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ func New(opts Options) *API {
106106
if err != nil {
107107
return uuid.Nil, err
108108
}
109-
return ws.Workspace.ID, nil
109+
return ws.ID, nil
110110
},
111111
}
112112

@@ -231,9 +231,9 @@ func (a *API) workspaceID(ctx context.Context, agent *database.WorkspaceAgent) (
231231
}
232232

233233
a.mu.Lock()
234-
a.cachedWorkspaceID = getWorkspaceAgentByIDRow.Workspace.ID
234+
a.cachedWorkspaceID = getWorkspaceAgentByIDRow.ID
235235
a.mu.Unlock()
236-
return getWorkspaceAgentByIDRow.Workspace.ID, nil
236+
return getWorkspaceAgentByIDRow.ID, nil
237237
}
238238

239239
func (a *API) publishWorkspaceUpdate(ctx context.Context, agent *database.WorkspaceAgent) error {

coderd/agentapi/stats.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func (a *StatsAPI) UpdateStats(ctx context.Context, req *agentproto.UpdateStatsR
5050
if err != nil {
5151
return nil, xerrors.Errorf("get workspace by agent ID %q: %w", workspaceAgent.ID, err)
5252
}
53-
workspace := getWorkspaceAgentByIDRow.Workspace
53+
workspace := getWorkspaceAgentByIDRow
5454
a.Log.Debug(ctx, "read stats report",
5555
slog.F("interval", a.AgentStatsRefreshInterval),
5656
slog.F("workspace_id", workspace.ID),

coderd/audit/diff.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ type Auditable interface {
1212
database.Template |
1313
database.TemplateVersion |
1414
database.User |
15-
database.Workspace |
15+
database.WorkspaceTable |
1616
database.GitSSHKey |
1717
database.WorkspaceBuild |
1818
database.AuditableGroup |

coderd/autobuild/lifecycle_executor.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -234,22 +234,25 @@ func (e *Executor) runOnce(t time.Time) Stats {
234234
// threshold for inactivity.
235235
if reason == database.BuildReasonDormancy {
236236
wsOld := ws
237-
ws, err = tx.UpdateWorkspaceDormantDeletingAt(e.ctx, database.UpdateWorkspaceDormantDeletingAtParams{
237+
wsNew, err := tx.UpdateWorkspaceDormantDeletingAt(e.ctx, database.UpdateWorkspaceDormantDeletingAtParams{
238238
ID: ws.ID,
239239
DormantAt: sql.NullTime{
240240
Time: dbtime.Now(),
241241
Valid: true,
242242
},
243243
})
244244

245-
auditLog = &auditParams{
246-
Old: wsOld,
247-
New: ws,
248-
}
249245
if err != nil {
250246
return xerrors.Errorf("update workspace dormant deleting at: %w", err)
251247
}
252248

249+
auditLog = &auditParams{
250+
Old: wsOld.WorkspaceTable(),
251+
New: wsNew,
252+
}
253+
// To keep the `ws` accurate without doing a sql fetch
254+
ws.DormantAt = wsNew.DormantAt
255+
253256
shouldNotifyDormancy = true
254257

255258
log.Info(e.ctx, "dormant workspace",
@@ -510,8 +513,8 @@ func isEligibleForFailedStop(build database.WorkspaceBuild, job database.Provisi
510513
}
511514

512515
type auditParams struct {
513-
Old database.Workspace
514-
New database.Workspace
516+
Old database.WorkspaceTable
517+
New database.WorkspaceTable
515518
Success bool
516519
}
517520

@@ -521,7 +524,7 @@ func auditBuild(ctx context.Context, log slog.Logger, auditor audit.Auditor, par
521524
status = http.StatusOK
522525
}
523526

524-
audit.BackgroundAudit(ctx, &audit.BackgroundAuditParams[database.Workspace]{
527+
audit.BackgroundAudit(ctx, &audit.BackgroundAuditParams[database.WorkspaceTable]{
525528
Audit: auditor,
526529
Log: log,
527530
UserID: params.New.OwnerID,

coderd/database/dbauthz/dbauthz.go

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2574,7 +2574,7 @@ func (q *querier) GetWorkspaceBuildsCreatedAfter(ctx context.Context, createdAt
25742574
return q.db.GetWorkspaceBuildsCreatedAfter(ctx, createdAt)
25752575
}
25762576

2577-
func (q *querier) GetWorkspaceByAgentID(ctx context.Context, agentID uuid.UUID) (database.GetWorkspaceByAgentIDRow, error) {
2577+
func (q *querier) GetWorkspaceByAgentID(ctx context.Context, agentID uuid.UUID) (database.Workspace, error) {
25782578
return fetch(q.log, q.auth, q.db.GetWorkspaceByAgentID)(ctx, agentID)
25792579
}
25802580

@@ -2719,7 +2719,7 @@ func (q *querier) GetWorkspaces(ctx context.Context, arg database.GetWorkspacesP
27192719
return q.db.GetAuthorizedWorkspaces(ctx, arg, prep)
27202720
}
27212721

2722-
func (q *querier) GetWorkspacesEligibleForTransition(ctx context.Context, now time.Time) ([]database.Workspace, error) {
2722+
func (q *querier) GetWorkspacesEligibleForTransition(ctx context.Context, now time.Time) ([]database.WorkspaceTable, error) {
27232723
return q.db.GetWorkspacesEligibleForTransition(ctx, now)
27242724
}
27252725

@@ -3009,7 +3009,7 @@ func (q *querier) InsertUserLink(ctx context.Context, arg database.InsertUserLin
30093009
return q.db.InsertUserLink(ctx, arg)
30103010
}
30113011

3012-
func (q *querier) InsertWorkspace(ctx context.Context, arg database.InsertWorkspaceParams) (database.Workspace, error) {
3012+
func (q *querier) InsertWorkspace(ctx context.Context, arg database.InsertWorkspaceParams) (database.WorkspaceTable, error) {
30133013
obj := rbac.ResourceWorkspace.WithOwner(arg.OwnerID.String()).InOrg(arg.OrganizationID)
30143014
return insert(q.log, q.auth, obj, q.db.InsertWorkspace)(ctx, arg)
30153015
}
@@ -3751,9 +3751,13 @@ func (q *querier) UpdateUserStatus(ctx context.Context, arg database.UpdateUserS
37513751
return updateWithReturn(q.log, q.auth, fetch, q.db.UpdateUserStatus)(ctx, arg)
37523752
}
37533753

3754-
func (q *querier) UpdateWorkspace(ctx context.Context, arg database.UpdateWorkspaceParams) (database.Workspace, error) {
3755-
fetch := func(ctx context.Context, arg database.UpdateWorkspaceParams) (database.Workspace, error) {
3756-
return q.db.GetWorkspaceByID(ctx, arg.ID)
3754+
func (q *querier) UpdateWorkspace(ctx context.Context, arg database.UpdateWorkspaceParams) (database.WorkspaceTable, error) {
3755+
fetch := func(ctx context.Context, arg database.UpdateWorkspaceParams) (database.WorkspaceTable, error) {
3756+
w, err := q.db.GetWorkspaceByID(ctx, arg.ID)
3757+
if err != nil {
3758+
return database.WorkspaceTable{}, err
3759+
}
3760+
return w.WorkspaceTable(), nil
37573761
}
37583762
return updateWithReturn(q.log, q.auth, fetch, q.db.UpdateWorkspace)(ctx, arg)
37593763
}
@@ -3905,9 +3909,13 @@ func (q *querier) UpdateWorkspaceDeletedByID(ctx context.Context, arg database.U
39053909
return deleteQ(q.log, q.auth, fetch, q.db.UpdateWorkspaceDeletedByID)(ctx, arg)
39063910
}
39073911

3908-
func (q *querier) UpdateWorkspaceDormantDeletingAt(ctx context.Context, arg database.UpdateWorkspaceDormantDeletingAtParams) (database.Workspace, error) {
3909-
fetch := func(ctx context.Context, arg database.UpdateWorkspaceDormantDeletingAtParams) (database.Workspace, error) {
3910-
return q.db.GetWorkspaceByID(ctx, arg.ID)
3912+
func (q *querier) UpdateWorkspaceDormantDeletingAt(ctx context.Context, arg database.UpdateWorkspaceDormantDeletingAtParams) (database.WorkspaceTable, error) {
3913+
fetch := func(ctx context.Context, arg database.UpdateWorkspaceDormantDeletingAtParams) (database.WorkspaceTable, error) {
3914+
w, err := q.db.GetWorkspaceByID(ctx, arg.ID)
3915+
if err != nil {
3916+
return database.WorkspaceTable{}, err
3917+
}
3918+
return w.WorkspaceTable(), nil
39113919
}
39123920
return updateWithReturn(q.log, q.auth, fetch, q.db.UpdateWorkspaceDormantDeletingAt)(ctx, arg)
39133921
}
@@ -3940,7 +3948,7 @@ func (q *querier) UpdateWorkspaceTTL(ctx context.Context, arg database.UpdateWor
39403948
return update(q.log, q.auth, fetch, q.db.UpdateWorkspaceTTL)(ctx, arg)
39413949
}
39423950

3943-
func (q *querier) UpdateWorkspacesDormantDeletingAtByTemplateID(ctx context.Context, arg database.UpdateWorkspacesDormantDeletingAtByTemplateIDParams) ([]database.Workspace, error) {
3951+
func (q *querier) UpdateWorkspacesDormantDeletingAtByTemplateID(ctx context.Context, arg database.UpdateWorkspacesDormantDeletingAtByTemplateIDParams) ([]database.WorkspaceTable, error) {
39443952
template, err := q.db.GetTemplateByID(ctx, arg.TemplateID)
39453953
if err != nil {
39463954
return nil, xerrors.Errorf("get template by id: %w", err)

0 commit comments

Comments
 (0)