Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 766a2ad

Browse files
f0sselpresleyp
andauthored
chore: refactor workspace count to single route (#4809)
Co-authored-by: Presley Pizzo <[email protected]>
1 parent 5fb9c33 commit 766a2ad

23 files changed

+156
-757
lines changed

cli/configssh.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,16 @@ type sshWorkspaceConfig struct {
7070
}
7171

7272
func sshFetchWorkspaceConfigs(ctx context.Context, client *codersdk.Client) ([]sshWorkspaceConfig, error) {
73-
workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{
73+
res, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{
7474
Owner: codersdk.Me,
7575
})
7676
if err != nil {
7777
return nil, err
7878
}
7979

8080
var errGroup errgroup.Group
81-
workspaceConfigs := make([]sshWorkspaceConfig, len(workspaces))
82-
for i, workspace := range workspaces {
81+
workspaceConfigs := make([]sshWorkspaceConfig, len(res.Workspaces))
82+
for i, workspace := range res.Workspaces {
8383
i := i
8484
workspace := workspace
8585
errGroup.Go(func() error {

cli/list.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,11 @@ func list() *cobra.Command {
9191
}
9292
filter.Owner = myUser.Username
9393
}
94-
workspaces, err := client.Workspaces(cmd.Context(), filter)
94+
res, err := client.Workspaces(cmd.Context(), filter)
9595
if err != nil {
9696
return err
9797
}
98-
if len(workspaces) == 0 {
98+
if len(res.Workspaces) == 0 {
9999
_, _ = fmt.Fprintln(cmd.ErrOrStderr(), cliui.Styles.Prompt.String()+"No workspaces found! Create one:")
100100
_, _ = fmt.Fprintln(cmd.ErrOrStderr())
101101
_, _ = fmt.Fprintln(cmd.ErrOrStderr(), " "+cliui.Styles.Code.Render("coder create <name>"))
@@ -112,8 +112,8 @@ func list() *cobra.Command {
112112
}
113113

114114
now := time.Now()
115-
displayWorkspaces = make([]workspaceListRow, len(workspaces))
116-
for i, workspace := range workspaces {
115+
displayWorkspaces = make([]workspaceListRow, len(res.Workspaces))
116+
for i, workspace := range res.Workspaces {
117117
displayWorkspaces[i] = workspaceListRowFromWorkspace(now, usersByID, workspace)
118118
}
119119

cli/ssh.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -231,17 +231,17 @@ func getWorkspaceAndAgent(ctx context.Context, cmd *cobra.Command, client *coder
231231
err error
232232
)
233233
if shuffle {
234-
workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{
234+
res, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{
235235
Owner: codersdk.Me,
236236
})
237237
if err != nil {
238238
return codersdk.Workspace{}, codersdk.WorkspaceAgent{}, err
239239
}
240-
if len(workspaces) == 0 {
240+
if len(res.Workspaces) == 0 {
241241
return codersdk.Workspace{}, codersdk.WorkspaceAgent{}, xerrors.New("no workspaces to shuffle")
242242
}
243243

244-
workspace, err = cryptorand.Element(workspaces)
244+
workspace, err = cryptorand.Element(res.Workspaces)
245245
if err != nil {
246246
return codersdk.Workspace{}, codersdk.WorkspaceAgent{}, err
247247
}

coderd/coderd.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,6 @@ func New(options *Options) *API {
524524
apiKeyMiddleware,
525525
)
526526
r.Get("/", api.workspaces)
527-
r.Get("/count", api.workspaceCount)
528527
r.Route("/{workspace}", func(r chi.Router) {
529528
r.Use(
530529
httpmw.ExtractWorkspaceParam(options.Database),

coderd/coderdtest/authorize.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,8 @@ func AGPLRoutes(a *AuthTester) (map[string]string, map[string]RouteCheck) {
244244
"POST:/api/v2/organizations/{organization}/templateversions": {StatusCode: http.StatusBadRequest, NoAuthorize: true},
245245

246246
// Endpoints that use the SQLQuery filter.
247-
"GET:/api/v2/workspaces/": {StatusCode: http.StatusOK, NoAuthorize: true},
248-
"GET:/api/v2/workspaces/count": {StatusCode: http.StatusOK, NoAuthorize: true},
249-
"GET:/api/v2/users/count": {StatusCode: http.StatusOK, NoAuthorize: true},
247+
"GET:/api/v2/workspaces/": {StatusCode: http.StatusOK, NoAuthorize: true},
248+
"GET:/api/v2/users/count": {StatusCode: http.StatusOK, NoAuthorize: true},
250249
}
251250

252251
// Routes like proxy routes support all HTTP methods. A helper func to expand

coderd/database/databasefake/databasefake.go

Lines changed: 0 additions & 150 deletions
Original file line numberDiff line numberDiff line change
@@ -857,156 +857,6 @@ func (q *fakeQuerier) GetAuthorizedWorkspaces(ctx context.Context, arg database.
857857
return workspaces, nil
858858
}
859859

860-
func (q *fakeQuerier) GetWorkspaceCount(ctx context.Context, arg database.GetWorkspaceCountParams) (int64, error) {
861-
count, err := q.GetAuthorizedWorkspaceCount(ctx, arg, nil)
862-
return count, err
863-
}
864-
865-
//nolint:gocyclo
866-
func (q *fakeQuerier) GetAuthorizedWorkspaceCount(ctx context.Context, arg database.GetWorkspaceCountParams, authorizedFilter rbac.AuthorizeFilter) (int64, error) {
867-
q.mutex.RLock()
868-
defer q.mutex.RUnlock()
869-
870-
workspaces := make([]database.Workspace, 0)
871-
for _, workspace := range q.workspaces {
872-
if arg.OwnerID != uuid.Nil && workspace.OwnerID != arg.OwnerID {
873-
continue
874-
}
875-
876-
if arg.OwnerUsername != "" {
877-
owner, err := q.GetUserByID(ctx, workspace.OwnerID)
878-
if err == nil && !strings.EqualFold(arg.OwnerUsername, owner.Username) {
879-
continue
880-
}
881-
}
882-
883-
if arg.TemplateName != "" {
884-
template, err := q.GetTemplateByID(ctx, workspace.TemplateID)
885-
if err == nil && !strings.EqualFold(arg.TemplateName, template.Name) {
886-
continue
887-
}
888-
}
889-
890-
if !arg.Deleted && workspace.Deleted {
891-
continue
892-
}
893-
894-
if arg.Name != "" && !strings.Contains(strings.ToLower(workspace.Name), strings.ToLower(arg.Name)) {
895-
continue
896-
}
897-
898-
if arg.Status != "" {
899-
build, err := q.GetLatestWorkspaceBuildByWorkspaceID(ctx, workspace.ID)
900-
if err != nil {
901-
return 0, xerrors.Errorf("get latest build: %w", err)
902-
}
903-
904-
job, err := q.GetProvisionerJobByID(ctx, build.JobID)
905-
if err != nil {
906-
return 0, xerrors.Errorf("get provisioner job: %w", err)
907-
}
908-
909-
switch arg.Status {
910-
case "pending":
911-
if !job.StartedAt.Valid {
912-
continue
913-
}
914-
915-
case "starting":
916-
if !job.StartedAt.Valid &&
917-
!job.CanceledAt.Valid &&
918-
job.CompletedAt.Valid &&
919-
time.Since(job.UpdatedAt) > 30*time.Second ||
920-
build.Transition != database.WorkspaceTransitionStart {
921-
continue
922-
}
923-
924-
case "running":
925-
if !job.CompletedAt.Valid &&
926-
job.CanceledAt.Valid &&
927-
job.Error.Valid ||
928-
build.Transition != database.WorkspaceTransitionStart {
929-
continue
930-
}
931-
932-
case "stopping":
933-
if !job.StartedAt.Valid &&
934-
!job.CanceledAt.Valid &&
935-
job.CompletedAt.Valid &&
936-
time.Since(job.UpdatedAt) > 30*time.Second ||
937-
build.Transition != database.WorkspaceTransitionStop {
938-
continue
939-
}
940-
941-
case "stopped":
942-
if !job.CompletedAt.Valid &&
943-
job.CanceledAt.Valid &&
944-
job.Error.Valid ||
945-
build.Transition != database.WorkspaceTransitionStop {
946-
continue
947-
}
948-
949-
case "failed":
950-
if (!job.CanceledAt.Valid && !job.Error.Valid) ||
951-
(!job.CompletedAt.Valid && !job.Error.Valid) {
952-
continue
953-
}
954-
955-
case "canceling":
956-
if !job.CanceledAt.Valid && job.CompletedAt.Valid {
957-
continue
958-
}
959-
960-
case "canceled":
961-
if !job.CanceledAt.Valid && !job.CompletedAt.Valid {
962-
continue
963-
}
964-
965-
case "deleted":
966-
if !job.StartedAt.Valid &&
967-
job.CanceledAt.Valid &&
968-
!job.CompletedAt.Valid &&
969-
time.Since(job.UpdatedAt) > 30*time.Second ||
970-
build.Transition != database.WorkspaceTransitionDelete {
971-
continue
972-
}
973-
974-
case "deleting":
975-
if !job.CompletedAt.Valid &&
976-
job.CanceledAt.Valid &&
977-
job.Error.Valid &&
978-
build.Transition != database.WorkspaceTransitionDelete {
979-
continue
980-
}
981-
982-
default:
983-
return 0, xerrors.Errorf("unknown workspace status in filter: %q", arg.Status)
984-
}
985-
}
986-
987-
if len(arg.TemplateIds) > 0 {
988-
match := false
989-
for _, id := range arg.TemplateIds {
990-
if workspace.TemplateID == id {
991-
match = true
992-
break
993-
}
994-
}
995-
if !match {
996-
continue
997-
}
998-
}
999-
1000-
// If the filter exists, ensure the object is authorized.
1001-
if authorizedFilter != nil && !authorizedFilter.Eval(workspace.RBACObject()) {
1002-
continue
1003-
}
1004-
workspaces = append(workspaces, workspace)
1005-
}
1006-
1007-
return int64(len(workspaces)), nil
1008-
}
1009-
1010860
func (q *fakeQuerier) GetWorkspaceByID(_ context.Context, id uuid.UUID) (database.Workspace, error) {
1011861
q.mutex.RLock()
1012862
defer q.mutex.RUnlock()

coderd/database/modelqueries.go

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ func (q *sqlQuerier) GetTemplateGroupRoles(ctx context.Context, id uuid.UUID) ([
113113

114114
type workspaceQuerier interface {
115115
GetAuthorizedWorkspaces(ctx context.Context, arg GetWorkspacesParams, authorizedFilter rbac.AuthorizeFilter) ([]Workspace, error)
116-
GetAuthorizedWorkspaceCount(ctx context.Context, arg GetWorkspaceCountParams, authorizedFilter rbac.AuthorizeFilter) (int64, error)
117116
}
118117

119118
// GetAuthorizedWorkspaces returns all workspaces that the user is authorized to access.
@@ -169,24 +168,6 @@ func (q *sqlQuerier) GetAuthorizedWorkspaces(ctx context.Context, arg GetWorkspa
169168
return items, nil
170169
}
171170

172-
func (q *sqlQuerier) GetAuthorizedWorkspaceCount(ctx context.Context, arg GetWorkspaceCountParams, authorizedFilter rbac.AuthorizeFilter) (int64, error) {
173-
filter := strings.Replace(getWorkspaceCount, "-- @authorize_filter", fmt.Sprintf(" AND %s", authorizedFilter.SQLString(rbac.NoACLConfig())), 1)
174-
// The name comment is for metric tracking
175-
query := fmt.Sprintf("-- name: GetAuthorizedWorkspaceCount :one\n%s", filter)
176-
row := q.db.QueryRowContext(ctx, query,
177-
arg.Deleted,
178-
arg.Status,
179-
arg.OwnerID,
180-
arg.OwnerUsername,
181-
arg.TemplateName,
182-
pq.Array(arg.TemplateIds),
183-
arg.Name,
184-
)
185-
var count int64
186-
err := row.Scan(&count)
187-
return count, err
188-
}
189-
190171
type userQuerier interface {
191172
GetAuthorizedUserCount(ctx context.Context, arg GetFilteredUserCountParams, authorizedFilter rbac.AuthorizeFilter) (int64, error)
192173
}

coderd/database/querier.go

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)