From 2a8c1b33cfefcd883b449a0798659e285abe2e41 Mon Sep 17 00:00:00 2001 From: Presley Pizzo Date: Fri, 14 Oct 2022 21:26:17 +0000 Subject: [PATCH] Add types, start writing count function --- coderd/workspaces.go | 42 ++++++++++++++++++++++++++++++++++ codersdk/workspaces.go | 12 ++++++++++ site/src/api/api.ts | 7 +++--- site/src/api/typesGenerated.ts | 15 ++++++++++++ 4 files changed, 72 insertions(+), 4 deletions(-) diff --git a/coderd/workspaces.go b/coderd/workspaces.go index c96967b126..869e71046e 100644 --- a/coderd/workspaces.go +++ b/coderd/workspaces.go @@ -157,6 +157,48 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { httpapi.Write(ctx, rw, http.StatusOK, wss) } +func (api *API) workspaceCount(rw http.ResponseWriter, r *http.Request) { + ctx := r.Context() + apiKey := httpmw.APIKey(r) + + queryStr := r.URL.Query().Get("q") + filter, errs := workspaceSearchQuery(queryStr) + if len(errs) > 0 { + httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ + Message: "Invalid audit search query.", + Validations: errs, + }) + return + } + + if filter.OwnerUsername == "me" { + filter.OwnerID = apiKey.UserID + filter.OwnerUsername = "" + } + + sqlFilter, err := api.HTTPAuth.AuthorizeSQLFilter(r, rbac.ActionRead, rbac.ResourceWorkspace.Type) + if err != nil { + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ + Message: "Internal error preparing sql filter.", + Detail: err.Error(), + }) + return + } + + count, err := api.Database.GetWorkspaceCount(ctx, filter, sqlFilter) + if err != nil { + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ + Message: "Internal error fetching workspace count.", + Detail: err.Error(), + }) + return + } + + httpapi.Write(ctx, rw, http.StatusOK, codersdk.WorkspaceCountResponse{ + Count: count, + }) +} + func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request) { ctx := r.Context() owner := httpmw.UserParam(r) diff --git a/codersdk/workspaces.go b/codersdk/workspaces.go index a019504ad9..17b26257c5 100644 --- a/codersdk/workspaces.go +++ b/codersdk/workspaces.go @@ -31,6 +31,18 @@ type Workspace struct { LastUsedAt time.Time `json:"last_used_at"` } +type WorkspacesRequest struct { + SearchQuery string `json:"q,omitempty"` + Pagination +} + +type WorkspaceCountRequest struct { + SearchQuery string `json:"q,omitempty"` +} +type WorkspaceCountResponse struct { + Count int64 `json:"count"` +} + // CreateWorkspaceBuildRequest provides options to update the latest workspace build. type CreateWorkspaceBuildRequest struct { TemplateVersionID uuid.UUID `json:"template_version_id,omitempty"` diff --git a/site/src/api/api.ts b/site/src/api/api.ts index 80818a97c8..7a490cce8e 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -279,7 +279,7 @@ export const getURLWithSearchParams = ( } export const getWorkspaces = async ( - options: TypesGen.AuditLogsRequest, + options: TypesGen.WorkspacesRequest, ): Promise => { const searchParams = new URLSearchParams() if (options.limit) { @@ -296,10 +296,9 @@ export const getWorkspaces = async ( return response.data } -// TODO change types export const getWorkspacesCount = async ( - options: TypesGen.AuditLogCountRequest = {}, -): Promise => { + options: TypesGen.WorkspaceCountRequest, +): Promise => { const searchParams = new URLSearchParams() if (options.q) { searchParams.set("q", options.q) diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index 92088b978f..44c8df3bd1 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -814,6 +814,16 @@ export interface WorkspaceBuildsRequest extends Pagination { readonly Since: string } +// From codersdk/workspaces.go +export interface WorkspaceCountRequest { + readonly q?: string +} + +// From codersdk/workspaces.go +export interface WorkspaceCountResponse { + readonly count: number +} + // From codersdk/workspaces.go export interface WorkspaceFilter { readonly q?: string @@ -851,6 +861,11 @@ export interface WorkspaceResourceMetadata { readonly sensitive: boolean } +// From codersdk/workspaces.go +export interface WorkspacesRequest extends Pagination { + readonly q?: string +} + // From codersdk/audit.go export type AuditAction = "create" | "delete" | "write"