From 352b86a9212dc7b20e26e7c072f7511fe1e0f06f Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Thu, 2 Jun 2022 12:19:26 -0500 Subject: [PATCH 01/21] chore: More UI friendly errors Mainly capitlization + messages prefix error --- coderd/authorize.go | 4 +--- coderd/csp.go | 3 ++- coderd/files.go | 10 +++++----- coderd/gitsshkey.go | 8 ++++---- coderd/members.go | 6 +++--- coderd/organizations.go | 6 +++--- 6 files changed, 18 insertions(+), 19 deletions(-) diff --git a/coderd/authorize.go b/coderd/authorize.go index 64d6af755413c..2f36a45e16886 100644 --- a/coderd/authorize.go +++ b/coderd/authorize.go @@ -21,9 +21,7 @@ func (api *API) Authorize(rw http.ResponseWriter, r *http.Request, action rbac.A roles := httpmw.AuthorizationUserRoles(r) err := api.Authorizer.ByRoleName(r.Context(), roles.ID.String(), roles.Roles, action, object.RBACObject()) if err != nil { - httpapi.Write(rw, http.StatusForbidden, httpapi.Response{ - Message: err.Error(), - }) + httpapi.Forbidden(rw) // Log the errors for debugging internalError := new(rbac.UnauthorizedError) diff --git a/coderd/csp.go b/coderd/csp.go index 5355a47ec505a..34b62f1c95b49 100644 --- a/coderd/csp.go +++ b/coderd/csp.go @@ -2,6 +2,7 @@ package coderd import ( "encoding/json" + "fmt" "net/http" "github.com/coder/coder/coderd/httpapi" @@ -23,7 +24,7 @@ func (api *API) logReportCSPViolations(rw http.ResponseWriter, r *http.Request) if err != nil { api.Logger.Warn(ctx, "csp violation", slog.Error(err)) httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "failed to read body", + Message: fmt.Sprintf("Failed to read body, invalid json: %s", err.Error()), }) return } diff --git a/coderd/files.go b/coderd/files.go index 5e63889496ae8..139fd22abffdb 100644 --- a/coderd/files.go +++ b/coderd/files.go @@ -32,7 +32,7 @@ func (api *API) postFile(rw http.ResponseWriter, r *http.Request) { case "application/x-tar": default: httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("unsupported content type: %s", contentType), + Message: fmt.Sprintf("Unsupported content type: %s", contentType), }) return } @@ -41,7 +41,7 @@ func (api *API) postFile(rw http.ResponseWriter, r *http.Request) { data, err := io.ReadAll(r.Body) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("read file: %s", err), + Message: fmt.Sprintf("Read file from request: %s", err), }) return } @@ -64,7 +64,7 @@ func (api *API) postFile(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("insert file: %s", err), + Message: fmt.Sprintf("Saving file: %s", err), }) return } @@ -78,7 +78,7 @@ func (api *API) fileByHash(rw http.ResponseWriter, r *http.Request) { hash := chi.URLParam(r, "hash") if hash == "" { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "hash must be provided", + Message: "File hash must be provided in url", }) return } @@ -89,7 +89,7 @@ func (api *API) fileByHash(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get file: %s", err), + Message: fmt.Sprintf("Fetch file: %s", err), }) return } diff --git a/coderd/gitsshkey.go b/coderd/gitsshkey.go index a80144fee2683..497c0cf2c9606 100644 --- a/coderd/gitsshkey.go +++ b/coderd/gitsshkey.go @@ -22,7 +22,7 @@ func (api *API) regenerateGitSSHKey(rw http.ResponseWriter, r *http.Request) { privateKey, publicKey, err := gitsshkey.Generate(api.SSHKeygenAlgorithm) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("regenerate key pair: %s", err), + Message: fmt.Sprintf("Regenerate key pair: %s", err), }) return } @@ -35,7 +35,7 @@ func (api *API) regenerateGitSSHKey(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("update git SSH key: %s", err), + Message: fmt.Sprintf("Update git SSH key: %s", err), }) return } @@ -43,7 +43,7 @@ func (api *API) regenerateGitSSHKey(rw http.ResponseWriter, r *http.Request) { newKey, err := api.Database.GetGitSSHKey(r.Context(), user.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get git SSH key: %s", err), + Message: fmt.Sprintf("Get Git SSH key: %s", err), }) return } @@ -67,7 +67,7 @@ func (api *API) gitSSHKey(rw http.ResponseWriter, r *http.Request) { gitSSHKey, err := api.Database.GetGitSSHKey(r.Context(), user.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("update git SSH key: %s", err), + Message: fmt.Sprintf("Update git SSH key: %s", err), }) return } diff --git a/coderd/members.go b/coderd/members.go index 7b16794c8584d..f89b048b4d509 100644 --- a/coderd/members.go +++ b/coderd/members.go @@ -76,11 +76,11 @@ func (api *API) updateOrganizationMemberRoles(ctx context.Context, args database roleOrg, err := uuid.Parse(orgID) if err != nil { - return database.OrganizationMember{}, xerrors.Errorf("role must have proper uuids for organization, %q does not", r) + return database.OrganizationMember{}, xerrors.Errorf("Role must have proper uuids for organization, %q does not", r) } if roleOrg != args.OrgID { - return database.OrganizationMember{}, xerrors.Errorf("must only pass roles for org %q", args.OrgID.String()) + return database.OrganizationMember{}, xerrors.Errorf("Must only pass roles for org %q", args.OrgID.String()) } if _, err := rbac.RoleByName(r); err != nil { @@ -90,7 +90,7 @@ func (api *API) updateOrganizationMemberRoles(ctx context.Context, args database updatedUser, err := api.Database.UpdateMemberRoles(ctx, args) if err != nil { - return database.OrganizationMember{}, xerrors.Errorf("update site roles: %w", err) + return database.OrganizationMember{}, xerrors.Errorf("Update site roles: %w", err) } return updatedUser, nil } diff --git a/coderd/organizations.go b/coderd/organizations.go index 0f58eac546bcb..0c9c0f34cdc2f 100644 --- a/coderd/organizations.go +++ b/coderd/organizations.go @@ -45,13 +45,13 @@ func (api *API) postOrganizations(rw http.ResponseWriter, r *http.Request) { _, err := api.Database.GetOrganizationByName(r.Context(), req.Name) if err == nil { httpapi.Write(rw, http.StatusConflict, httpapi.Response{ - Message: "organization already exists with that name", + Message: "Organization already exists with that name", }) return } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get organization: %s", err.Error()), + Message: fmt.Sprintf("Get organization: %s", err.Error()), }) return } @@ -83,7 +83,7 @@ func (api *API) postOrganizations(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: err.Error(), + Message: fmt.Sprintf("Insert organization member: %s", err.Error()), }) return } From 7f9b66ac65d402e32819d30a4a7bb714c64a2fac Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 08:42:55 -0500 Subject: [PATCH 02/21] chore: Update BE http errors to be ui friendly --- coderd/csp.go | 4 +- coderd/files.go | 11 +++-- coderd/gitsshkey.go | 25 ++++++---- coderd/httpapi/httpapi.go | 15 +++++- coderd/organizations.go | 6 ++- coderd/pagination.go | 19 ++++++-- coderd/parameters.go | 38 ++++++++++----- coderd/provisionerdaemons.go | 3 +- coderd/provisionerjobs.go | 32 +++++++++---- coderd/roles.go | 3 +- coderd/templates.go | 42 ++++++++++------ coderd/templateversions.go | 92 +++++++++++++++++++++++------------- coderd/userauth.go | 15 ++++-- 13 files changed, 207 insertions(+), 98 deletions(-) diff --git a/coderd/csp.go b/coderd/csp.go index 34b62f1c95b49..c9f2c26026f83 100644 --- a/coderd/csp.go +++ b/coderd/csp.go @@ -2,7 +2,6 @@ package coderd import ( "encoding/json" - "fmt" "net/http" "github.com/coder/coder/coderd/httpapi" @@ -24,7 +23,8 @@ func (api *API) logReportCSPViolations(rw http.ResponseWriter, r *http.Request) if err != nil { api.Logger.Warn(ctx, "csp violation", slog.Error(err)) httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("Failed to read body, invalid json: %s", err.Error()), + Message: "Failed to read body, invalid json", + Internal: err.Error(), }) return } diff --git a/coderd/files.go b/coderd/files.go index 139fd22abffdb..121605ebf10c6 100644 --- a/coderd/files.go +++ b/coderd/files.go @@ -32,7 +32,7 @@ func (api *API) postFile(rw http.ResponseWriter, r *http.Request) { case "application/x-tar": default: httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("Unsupported content type: %s", contentType), + Message: fmt.Sprintf("Unsupported content type header %q", contentType), }) return } @@ -41,7 +41,8 @@ func (api *API) postFile(rw http.ResponseWriter, r *http.Request) { data, err := io.ReadAll(r.Body) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("Read file from request: %s", err), + Message: "Failed to read file from request", + Internal: err.Error(), }) return } @@ -64,7 +65,8 @@ func (api *API) postFile(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Saving file: %s", err), + Message: "Internal error saving file", + Internal: err.Error(), }) return } @@ -89,7 +91,8 @@ func (api *API) fileByHash(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Fetch file: %s", err), + Message: fmt.Sprintf("Internal error fetching file"), + Internal: err.Error(), }) return } diff --git a/coderd/gitsshkey.go b/coderd/gitsshkey.go index 497c0cf2c9606..6b7c986069373 100644 --- a/coderd/gitsshkey.go +++ b/coderd/gitsshkey.go @@ -1,7 +1,6 @@ package coderd import ( - "fmt" "net/http" "github.com/coder/coder/coderd/database" @@ -22,7 +21,8 @@ func (api *API) regenerateGitSSHKey(rw http.ResponseWriter, r *http.Request) { privateKey, publicKey, err := gitsshkey.Generate(api.SSHKeygenAlgorithm) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Regenerate key pair: %s", err), + Message: "Internal error generating a new ssh keypair", + Internal: err.Error(), }) return } @@ -35,7 +35,8 @@ func (api *API) regenerateGitSSHKey(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Update git SSH key: %s", err), + Message: "Internal error updating user's git ssh key", + Internal: err.Error(), }) return } @@ -43,7 +44,8 @@ func (api *API) regenerateGitSSHKey(rw http.ResponseWriter, r *http.Request) { newKey, err := api.Database.GetGitSSHKey(r.Context(), user.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Get Git SSH key: %s", err), + Message: "Internal error fetching user's git ssh key", + Internal: err.Error(), }) return } @@ -67,7 +69,8 @@ func (api *API) gitSSHKey(rw http.ResponseWriter, r *http.Request) { gitSSHKey, err := api.Database.GetGitSSHKey(r.Context(), user.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Update git SSH key: %s", err), + Message: "Internal error fetching user's ssh key", + Internal: err.Error(), }) return } @@ -86,7 +89,8 @@ func (api *API) agentGitSSHKey(rw http.ResponseWriter, r *http.Request) { resource, err := api.Database.GetWorkspaceResourceByID(r.Context(), agent.ResourceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("getting workspace resources: %s", err), + Message: "Internal error fetching workspace resource", + Internal: err.Error(), }) return } @@ -94,7 +98,8 @@ func (api *API) agentGitSSHKey(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetWorkspaceBuildByJobID(r.Context(), resource.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("getting workspace build: %s", err), + Message: "Internal error fetching workspace build", + Internal: err.Error(), }) return } @@ -102,7 +107,8 @@ func (api *API) agentGitSSHKey(rw http.ResponseWriter, r *http.Request) { workspace, err := api.Database.GetWorkspaceByID(r.Context(), job.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("getting workspace: %s", err), + Message: "Internal error fetching workspace", + Internal: err.Error(), }) return } @@ -110,7 +116,8 @@ func (api *API) agentGitSSHKey(rw http.ResponseWriter, r *http.Request) { gitSSHKey, err := api.Database.GetGitSSHKey(r.Context(), workspace.OwnerID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("getting git SSH key: %s", err), + Message: "Internal error fetching git ssh key", + Internal: err.Error(), }) return } diff --git a/coderd/httpapi/httpapi.go b/coderd/httpapi/httpapi.go index 385c88020e161..097c0e9c90e67 100644 --- a/coderd/httpapi/httpapi.go +++ b/coderd/httpapi/httpapi.go @@ -52,8 +52,19 @@ func init() { // Response represents a generic HTTP response. type Response struct { - Message string `json:"message" validate:"required"` - Errors []Error `json:"errors,omitempty" validate:"required"` + // Message is for general user-friendly error messages. This message will + // be shown at the top/bottom of a form, or in a toast on the UI. + Message string `json:"message"` + // Internal has the technical error information (err.Error()). These details + // might come from external packages and might not be user friendly. + // Do not populate this error field with any sensitive information or + // any errors that may be a security implication. These details are still + // available to more technical users. + Internal string `json:"internal"` + // Errors are form field-specific friendly error messages. They will be + // shown on a form field in the UI. These can also be used to add additional + // context if there is a set of errors in the primary 'Message'. + Errors []Error `json:"errors,omitempty"` } // Error represents a scoped error to a user input. diff --git a/coderd/organizations.go b/coderd/organizations.go index 0c9c0f34cdc2f..cb726c15fbfaf 100644 --- a/coderd/organizations.go +++ b/coderd/organizations.go @@ -51,7 +51,8 @@ func (api *API) postOrganizations(rw http.ResponseWriter, r *http.Request) { } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Get organization: %s", err.Error()), + Message: fmt.Sprintf("Internal error fetching organization %q", req.Name), + Internal: err.Error(), }) return } @@ -83,7 +84,8 @@ func (api *API) postOrganizations(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Insert organization member: %s", err.Error()), + Message: "Internal error inserting organization member", + Internal: err.Error(), }) return } diff --git a/coderd/pagination.go b/coderd/pagination.go index 2fbc2a0df6c70..037d08c729e72 100644 --- a/coderd/pagination.go +++ b/coderd/pagination.go @@ -1,7 +1,6 @@ package coderd import ( - "fmt" "net/http" "strconv" @@ -25,7 +24,11 @@ func parsePagination(w http.ResponseWriter, r *http.Request) (p codersdk.Paginat afterID, err = uuid.Parse(r.URL.Query().Get("after_id")) if err != nil { httpapi.Write(w, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("after_id must be a valid uuid: %s", err.Error()), + Message: "Query param 'after_id' must be a valid uuid", + Internal: err.Error(), + Errors: []httpapi.Error{ + {Field: "after_id", Detail: err.Error()}, + }, }) return p, false } @@ -34,7 +37,11 @@ func parsePagination(w http.ResponseWriter, r *http.Request) (p codersdk.Paginat limit, err = strconv.Atoi(s) if err != nil { httpapi.Write(w, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("limit must be an integer: %s", err.Error()), + Message: "Query param 'limit' must be a valid integer", + Internal: err.Error(), + Errors: []httpapi.Error{ + {Field: "limit", Detail: err.Error()}, + }, }) return p, false } @@ -43,7 +50,11 @@ func parsePagination(w http.ResponseWriter, r *http.Request) (p codersdk.Paginat offset, err = strconv.Atoi(s) if err != nil { httpapi.Write(w, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("offset must be an integer: %s", err.Error()), + Message: "Query param 'offset' must be a valid integer", + Internal: err.Error(), + Errors: []httpapi.Error{ + {Field: "offset", Detail: err.Error()}, + }, }) return p, false } diff --git a/coderd/parameters.go b/coderd/parameters.go index 21a0d9ff5ce26..b1a56d5ba7581 100644 --- a/coderd/parameters.go +++ b/coderd/parameters.go @@ -41,13 +41,14 @@ func (api *API) postParameter(rw http.ResponseWriter, r *http.Request) { }) if err == nil { httpapi.Write(rw, http.StatusConflict, httpapi.Response{ - Message: fmt.Sprintf("a parameter already exists in scope %q with name %q", scope, createRequest.Name), + Message: fmt.Sprintf("Parameter already exists in scope %q and name %q", scope, createRequest.Name), }) return } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get parameter value: %s", err), + Message: "Internal error fetching parameter", + Internal: err.Error(), }) return } @@ -65,7 +66,8 @@ func (api *API) postParameter(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("insert parameter value: %s", err), + Message: "Internal error inserting parameter", + Internal: err.Error(), }) return } @@ -96,7 +98,8 @@ func (api *API) parameters(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get parameter values by scope: %s", err), + Message: "Internal error fetching parameter scope values", + Internal: err.Error(), }) return } @@ -130,20 +133,23 @@ func (api *API) deleteParameter(rw http.ResponseWriter, r *http.Request) { }) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: fmt.Sprintf("parameter doesn't exist in the provided scope with name %q", name), + Message: fmt.Sprintf("No parameter found at the provided scope with name %q", name), + Internal: err.Error(), }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get parameter value: %s", err), + Message: fmt.Sprintf("Internal error fetching parameter"), + Internal: err.Error(), }) return } err = api.Database.DeleteParameterValueByID(r.Context(), parameterValue.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("delete parameter: %s", err), + Message: fmt.Sprintf("Internal error deleting parameter"), + Internal: err.Error(), }) return } @@ -224,9 +230,10 @@ func (api *API) parameterRBACResource(rw http.ResponseWriter, r *http.Request, s // This scope does not make sense from this api. // ImportJob params are created with the job, and the job id cannot // be predicted. - err = xerrors.Errorf("ImportJob scope not supported") + // Just fallthrough to the unsupported error + fallthrough default: - err = xerrors.Errorf("scope %q unsupported", scope) + err = xerrors.Errorf("Parameter scope %q unsupported", scope) } // Write error payload to rw if we cannot find the resource for the scope @@ -235,7 +242,7 @@ func (api *API) parameterRBACResource(rw http.ResponseWriter, r *http.Request, s httpapi.Forbidden(rw) } else { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("param scope resource: %s", err.Error()), + Message: err.Error(), }) } return nil, false @@ -256,7 +263,10 @@ func readScopeAndID(rw http.ResponseWriter, r *http.Request) (database.Parameter scope = database.ParameterScopeWorkspace default: httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("invalid scope %q", scope), + Message: fmt.Sprintf("Invalid scope %q", scope), + Errors: []httpapi.Error{ + {Field: "scope", Detail: "invalid scope"}, + }, }) return scope, uuid.Nil, false } @@ -265,7 +275,11 @@ func readScopeAndID(rw http.ResponseWriter, r *http.Request) (database.Parameter uid, err := uuid.Parse(id) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("invalid uuid %q: %s", id, err), + Message: fmt.Sprintf("Invalid uuid %q", id), + Internal: err.Error(), + Errors: []httpapi.Error{ + {Field: "id", Detail: "Invalid uuid"}, + }, }) return scope, uuid.Nil, false } diff --git a/coderd/provisionerdaemons.go b/coderd/provisionerdaemons.go index 9b60558c41d52..86365f26b4259 100644 --- a/coderd/provisionerdaemons.go +++ b/coderd/provisionerdaemons.go @@ -38,7 +38,8 @@ func (api *API) provisionerDaemons(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner daemons: %s", err), + Message: "Internal error fetching provisioner daemons", + Internal: err.Error(), }) return } diff --git a/coderd/provisionerjobs.go b/coderd/provisionerjobs.go index a47cc15541994..d0fbee86a9010 100644 --- a/coderd/provisionerjobs.go +++ b/coderd/provisionerjobs.go @@ -32,7 +32,7 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job beforeRaw := r.URL.Query().Get("before") if beforeRaw != "" && follow { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "before cannot be used with follow", + Message: "Query param \"before\" cannot be used with \"follow\"", }) return } @@ -43,7 +43,11 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job afterMS, err := strconv.ParseInt(afterRaw, 10, 64) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("unable to parse after %q: %s", afterRaw, err), + Message: "Query param \"after\" must be an integer", + Internal: err.Error(), + Errors: []httpapi.Error{ + {Field: "after", Detail: "Must be an integer"}, + }, }) return } @@ -59,7 +63,11 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job beforeMS, err := strconv.ParseInt(beforeRaw, 10, 64) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("unable to parse before %q: %s", beforeRaw, err), + Message: "Query param \"before\" must be an integer", + Internal: err.Error(), + Errors: []httpapi.Error{ + {Field: "before", Detail: "Must be an integer"}, + }, }) return } @@ -79,7 +87,8 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner logs: %s", err), + Message: "Internal error fetching provisioner logs", + Internal: err.Error(), }) return } @@ -112,7 +121,8 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("subscribe to provisioner job logs: %s", err), + Message: "Internal error watching provisioner logs", + Internal: err.Error(), }) return } @@ -128,7 +138,8 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprint("get provisioner job logs: %w", err), + Message: "Internal error fetching provisioner logs", + Internal: err.Error(), }) return } @@ -191,7 +202,8 @@ func (api *API) provisionerJobResources(rw http.ResponseWriter, r *http.Request, } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job resources: %s", err), + Message: "Internal error fetching job resources", + Internal: err.Error(), }) return } @@ -205,7 +217,8 @@ func (api *API) provisionerJobResources(rw http.ResponseWriter, r *http.Request, } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace agents by resources: %s", err), + Message: "Internal error fetching workspace agent", + Internal: err.Error(), }) return } @@ -220,7 +233,8 @@ func (api *API) provisionerJobResources(rw http.ResponseWriter, r *http.Request, apiAgent, err := convertWorkspaceAgent(agent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("convert provisioner job agent: %s", err), + Message: "Internal error reading job agent", + Internal: err.Error(), }) return } diff --git a/coderd/roles.go b/coderd/roles.go index 4443ec1e6dc5a..1c6ba9d385516 100644 --- a/coderd/roles.go +++ b/coderd/roles.go @@ -1,6 +1,7 @@ package coderd import ( + "fmt" "net/http" "github.com/coder/coder/coderd/httpmw" @@ -60,7 +61,7 @@ func (api *API) checkPermissions(rw http.ResponseWriter, r *http.Request) { for k, v := range params.Checks { if v.Object.ResourceType == "" { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "'resource_type' must be defined", + Message: fmt.Sprintf("Object's \"resource_type\" field must be defined for key %q", k), }) return } diff --git a/coderd/templates.go b/coderd/templates.go index 185836e293335..4f8c9a8f300f8 100644 --- a/coderd/templates.go +++ b/coderd/templates.go @@ -27,7 +27,8 @@ func (api *API) template(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace counts: %s", err.Error()), + Message: "Internal error fetching workspace count", + Internal: err.Error(), }) return } @@ -58,7 +59,8 @@ func (api *API) deleteTemplate(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspaces by template id: %s", err), + Message: "Internal error fetching workspaces by template id", + Internal: err.Error(), }) return } @@ -74,7 +76,8 @@ func (api *API) deleteTemplate(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("update template deleted by id: %s", err), + Message: "Internal error deleting template", + Internal: err.Error(), }) return } @@ -100,7 +103,7 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque }) if err == nil { httpapi.Write(rw, http.StatusConflict, httpapi.Response{ - Message: fmt.Sprintf("template %q already exists", createTemplate.Name), + Message: fmt.Sprintf("Template with name %q already exists", createTemplate.Name), Errors: []httpapi.Error{{ Field: "name", Detail: "This value is already in use and should be unique.", @@ -110,27 +113,33 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template by name: %s", err), + Message: "Internal error fetching template by name", + Internal: err.Error(), }) return } templateVersion, err := api.Database.GetTemplateVersionByID(r.Context(), createTemplate.VersionID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: "template version does not exist", + Message: fmt.Sprintf("Template version %q does not exist", createTemplate.VersionID), + Errors: []httpapi.Error{ + {Field: "template_version_id", Detail: "Template version does not exist"}, + }, }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template version by id: %s", err), + Message: "Internal error fetching template version", + Internal: err.Error(), }) return } importJob, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get import job by id: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -185,7 +194,8 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: err.Error(), + Message: "Internal error inserting template", + Internal: err.Error(), }) return } @@ -203,7 +213,8 @@ func (api *API) templatesByOrganization(rw http.ResponseWriter, r *http.Request) } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get templates: %s", err.Error()), + Message: "Internal error fetching templates in organization", + Internal: err.Error(), }) return } @@ -222,7 +233,8 @@ func (api *API) templatesByOrganization(rw http.ResponseWriter, r *http.Request) } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace counts: %s", err.Error()), + Message: "Internal error fetching workspace counts", + Internal: err.Error(), }) return } @@ -240,13 +252,14 @@ func (api *API) templateByOrganizationAndName(rw http.ResponseWriter, r *http.Re if err != nil { if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: fmt.Sprintf("no template found by name %q in the %q organization", templateName, organization.Name), + Message: fmt.Sprintf("No template found by name %q in the %q organization", templateName, organization.Name), }) return } httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template by organization and name: %s", err), + Message: "Internal error fetching template", + Internal: err.Error(), }) return } @@ -261,7 +274,8 @@ func (api *API) templateByOrganizationAndName(rw http.ResponseWriter, r *http.Re } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace counts: %s", err.Error()), + Message: "Internal error fetching workspace counts", + Internal: err.Error(), }) return } diff --git a/coderd/templateversions.go b/coderd/templateversions.go index d4fe2f9e779f4..b878a0c6fb9f6 100644 --- a/coderd/templateversions.go +++ b/coderd/templateversions.go @@ -29,7 +29,8 @@ func (api *API) templateVersion(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -46,7 +47,8 @@ func (api *API) patchCancelTemplateVersion(rw http.ResponseWriter, r *http.Reque job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -71,7 +73,8 @@ func (api *API) patchCancelTemplateVersion(rw http.ResponseWriter, r *http.Reque }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("update provisioner job: %s", err), + Message: "Internal error updating provisioner job", + Internal: err.Error(), }) return } @@ -89,7 +92,8 @@ func (api *API) templateVersionSchema(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -105,7 +109,8 @@ func (api *API) templateVersionSchema(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("list parameter schemas: %s", err), + Message: "Internal error listing parameter schemas", + Internal: err.Error(), }) return } @@ -114,7 +119,8 @@ func (api *API) templateVersionSchema(rw http.ResponseWriter, r *http.Request) { apiSchema, err := convertParameterSchema(schema) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("convert: %s", err), + Message: fmt.Sprintf("Internal error converting schema %s", schema.Name), + Internal: err.Error(), }) return } @@ -133,7 +139,8 @@ func (api *API) templateVersionParameters(rw http.ResponseWriter, r *http.Reques job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -153,7 +160,8 @@ func (api *API) templateVersionParameters(rw http.ResponseWriter, r *http.Reques }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("compute values: %s", err), + Message: "Internal error computing values", + Internal: err.Error(), }) return } @@ -185,7 +193,8 @@ func (api *API) postTemplateVersionDryRun(rw http.ResponseWriter, r *http.Reques job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error updating provisioner job", + Internal: err.Error(), }) return } @@ -218,8 +227,9 @@ func (api *API) postTemplateVersionDryRun(rw http.ResponseWriter, r *http.Reques ParameterValues: parameterValues, }) if err != nil { - httpapi.Write(rw, http.StatusPreconditionFailed, httpapi.Response{ - Message: fmt.Sprintf("marshal new provisioner job: %s", err), + httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ + Message: "Internal error unmarshalling provisioner job", + Internal: err.Error(), }) return } @@ -240,7 +250,8 @@ func (api *API) postTemplateVersionDryRun(rw http.ResponseWriter, r *http.Reques }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("insert provisioner job: %s", err), + Message: "Internal error inserting provisioner job", + Internal: err.Error(), }) return } @@ -309,7 +320,8 @@ func (api *API) patchTemplateVersionDryRunCancel(rw http.ResponseWriter, r *http }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("update provisioner job: %s", err), + Message: "Internal error updating provisioner job", + Internal: err.Error(), }) return } @@ -331,7 +343,8 @@ func (api *API) fetchTemplateVersionDryRunJob(rw http.ResponseWriter, r *http.Re jobUUID, err := uuid.Parse(jobID) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Job ID must be a valid UUID", + Message: fmt.Sprintf("Job ID %q must be a valid UUID", jobID), + Internal: err.Error(), }) return database.ProvisionerJob{}, false } @@ -343,7 +356,8 @@ func (api *API) fetchTemplateVersionDryRunJob(rw http.ResponseWriter, r *http.Re } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job by ID %q: %s", jobUUID.String(), err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return database.ProvisionerJob{}, false } @@ -362,7 +376,8 @@ func (api *API) fetchTemplateVersionDryRunJob(rw http.ResponseWriter, r *http.Re err = json.Unmarshal(job.Input, &input) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("unmarshal job metadata: %s", err), + Message: "Internal error unmarshaling job metadata", + Internal: err.Error(), }) return database.ProvisionerJob{}, false } @@ -394,12 +409,13 @@ func (api *API) templateVersionsByTemplate(rw http.ResponseWriter, r *http.Reque _, err := store.GetTemplateVersionByID(r.Context(), paginationParams.AfterID) if err != nil && xerrors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("record at \"after_id\" (%q) does not exists", paginationParams.AfterID.String()), + Message: fmt.Sprintf("Record at \"after_id\" (%q) does not exists", paginationParams.AfterID.String()), }) return err } else if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template version at after_id: %s", err), + Message: "Internal error fetching template version at after_id", + Internal: err.Error(), }) return err } @@ -417,7 +433,8 @@ func (api *API) templateVersionsByTemplate(rw http.ResponseWriter, r *http.Reque } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template version: %s", err), + Message: "Internal error fetching template versions", + Internal: err.Error(), }) return err } @@ -429,7 +446,8 @@ func (api *API) templateVersionsByTemplate(rw http.ResponseWriter, r *http.Reque jobs, err := store.GetProvisionerJobsByIDs(r.Context(), jobIDs) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get jobs: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return err } @@ -442,7 +460,7 @@ func (api *API) templateVersionsByTemplate(rw http.ResponseWriter, r *http.Reque job, exists := jobByID[version.JobID.String()] if !exists { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("job %q doesn't exist for version %q", version.JobID, version.ID), + Message: fmt.Sprintf("Job %q doesn't exist for version %q", version.JobID, version.ID), }) return err } @@ -474,20 +492,22 @@ func (api *API) templateVersionByName(rw http.ResponseWriter, r *http.Request) { }) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: fmt.Sprintf("no template version found by name %q", templateVersionName), + Message: fmt.Sprintf("No template version found by name %q", templateVersionName), }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template version by name: %s", err), + Message: "Internal error fetching template version", + Internal: err.Error(), }) return } job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -508,13 +528,14 @@ func (api *API) patchActiveTemplateVersion(rw http.ResponseWriter, r *http.Reque version, err := api.Database.GetTemplateVersionByID(r.Context(), req.ID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: "template version not found", + Message: "Template version not found", }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template version: %s", err), + Message: "Internal error fetching template version", + Internal: err.Error(), }) return } @@ -530,7 +551,8 @@ func (api *API) patchActiveTemplateVersion(rw http.ResponseWriter, r *http.Reque }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("update active template version: %s", err), + Message: "Internal error updating active template version", + Internal: err.Error(), }) return } @@ -552,13 +574,14 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht _, err := api.Database.GetTemplateByID(r.Context(), req.TemplateID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: "template does not exist", + Message: "Template does not exist", }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template: %s", err), + Message: "Internal error fetching template", + Internal: err.Error(), }) return } @@ -567,13 +590,14 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht file, err := api.Database.GetFileByHash(r.Context(), req.StorageSource) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: "file not found", + Message: "File not found", }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get file: %s", err), + Message: "Internal error fetching file", + Internal: err.Error(), }) return } @@ -671,7 +695,8 @@ func (api *API) templateVersionResources(rw http.ResponseWriter, r *http.Request job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -691,7 +716,8 @@ func (api *API) templateVersionLogs(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } diff --git a/coderd/userauth.go b/coderd/userauth.go index 5838f933e2571..89fead21bdcc2 100644 --- a/coderd/userauth.go +++ b/coderd/userauth.go @@ -42,7 +42,8 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { memberships, err := api.GithubOAuth2Config.ListOrganizationMemberships(r.Context(), oauthClient) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get authenticated github user organizations: %s", err), + Message: "Internal error fetching authenticated github user organizations", + Internal: err.Error(), }) return } @@ -66,7 +67,8 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { emails, err := api.GithubOAuth2Config.ListEmails(r.Context(), oauthClient) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get personal github user: %s", err), + Message: "Internal error fetching personal github user", + Internal: err.Error(), }) return } @@ -86,7 +88,8 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get user by email: %s", err), + Message: fmt.Sprintf("Internal error fetching user by email %q", *email.Email), + Internal: err.Error(), }) return } @@ -119,7 +122,8 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { ghUser, err := api.GithubOAuth2Config.AuthenticatedUser(r.Context(), oauthClient) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get authenticated github user: %s", err), + Message: "Internal error fetching authenticated github user", + Internal: err.Error(), }) return } @@ -144,7 +148,8 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("create user: %s", err), + Message: "Internal error creating user", + Internal: err.Error(), }) return } From 46b52d5e316e785a5b5fbd15d18a4e75c4c2b679 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 09:30:31 -0500 Subject: [PATCH 03/21] chore: More friendly errors as responses --- coderd/httpapi/httpapi.go | 8 +- coderd/httpmw/apikey.go | 29 +++--- coderd/httpmw/httpmw.go | 7 +- coderd/httpmw/oauth2.go | 12 ++- coderd/httpmw/organizationparam.go | 10 +- coderd/httpmw/templateparam.go | 7 +- coderd/httpmw/templateversionparam.go | 5 +- coderd/httpmw/userparam.go | 4 +- coderd/httpmw/workspaceagent.go | 9 +- coderd/httpmw/workspaceagentparam.go | 20 ++-- coderd/httpmw/workspacebuildparam.go | 5 +- coderd/httpmw/workspaceparam.go | 5 +- coderd/httpmw/workspaceresourceparam.go | 12 ++- coderd/users.go | 93 ++++++++++++------- coderd/workspaceagents.go | 53 +++++++---- coderd/workspacebuilds.go | 68 ++++++++------ coderd/workspaceresourceauth.go | 34 ++++--- coderd/workspaceresources.go | 10 +- coderd/workspaces.go | 118 ++++++++++++++++-------- 19 files changed, 324 insertions(+), 185 deletions(-) diff --git a/coderd/httpapi/httpapi.go b/coderd/httpapi/httpapi.go index 097c0e9c90e67..ed4820dbe0519 100644 --- a/coderd/httpapi/httpapi.go +++ b/coderd/httpapi/httpapi.go @@ -75,7 +75,7 @@ type Error struct { func Forbidden(rw http.ResponseWriter) { Write(rw, http.StatusForbidden, Response{ - Message: "forbidden", + Message: "Forbidden", }) } @@ -104,7 +104,8 @@ func Read(rw http.ResponseWriter, r *http.Request, value interface{}) bool { err := json.NewDecoder(r.Body).Decode(value) if err != nil { Write(rw, http.StatusBadRequest, Response{ - Message: fmt.Sprintf("read body: %s", err.Error()), + Message: "Request body must be valid json", + Internal: err.Error(), }) return false } @@ -126,7 +127,8 @@ func Read(rw http.ResponseWriter, r *http.Request, value interface{}) bool { } if err != nil { Write(rw, http.StatusInternalServerError, Response{ - Message: fmt.Sprintf("validation: %s", err.Error()), + Message: "Internal error validating request body payload", + Internal: err.Error(), }) return false } diff --git a/coderd/httpmw/apikey.go b/coderd/httpmw/apikey.go index 7738e98f1f247..94f38e69acf55 100644 --- a/coderd/httpmw/apikey.go +++ b/coderd/httpmw/apikey.go @@ -65,7 +65,7 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h } if cookieValue == "" { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("%q cookie or query parameter must be provided", SessionTokenKey), + Message: fmt.Sprintf("Cookie %q or query parameter must be provided", SessionTokenKey), }) return } @@ -73,7 +73,7 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h // APIKeys are formatted: ID-SECRET if len(parts) != 2 { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("invalid %q cookie api key format", SessionTokenKey), + Message: fmt.Sprintf("Invalid %q cookie api key format", SessionTokenKey), }) return } @@ -82,13 +82,13 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h // Ensuring key lengths are valid. if len(keyID) != 10 { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("invalid %q cookie api key id", SessionTokenKey), + Message: fmt.Sprintf("Invalid %q cookie api key id", SessionTokenKey), }) return } if len(keySecret) != 22 { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("invalid %q cookie api key secret", SessionTokenKey), + Message: fmt.Sprintf("Invalid %q cookie api key secret", SessionTokenKey), }) return } @@ -96,12 +96,13 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h if err != nil { if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "api key is invalid", + Message: "Api key is invalid", }) return } httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get api key by id: %s", err.Error()), + Message: "Internal error fetching api key by id", + Internal: err.Error(), }) return } @@ -110,7 +111,7 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h // Checking to see if the secret is valid. if subtle.ConstantTimeCompare(key.HashedSecret, hashed[:]) != 1 { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "api key secret is invalid", + Message: "Api key secret is invalid", }) return } @@ -127,7 +128,7 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h oauthConfig = oauth.Github default: httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("unexpected authentication type %q", key.LoginType), + Message: fmt.Sprintf("Unexpected authentication type %q", key.LoginType), }) return } @@ -139,7 +140,8 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h }).Token() if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("couldn't refresh expired oauth token: %s", err.Error()), + Message: "Could not refresh expired oauth token", + Internal: err.Error(), }) return } @@ -154,7 +156,7 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h // Checking if the key is expired. if key.ExpiresAt.Before(now) { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("api key expired at %q", key.ExpiresAt.String()), + Message: fmt.Sprintf("Api key expired at %q", key.ExpiresAt.String()), }) return } @@ -182,7 +184,7 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("api key couldn't update: %s", err.Error()), + Message: fmt.Sprintf("Api key couldn't update: %s", err.Error()), }) return } @@ -194,14 +196,15 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h roles, err := db.GetAuthorizationUserRoles(r.Context(), key.UserID) if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "roles not found", + Message: "Internal error fetching user's roles", + Internal: err.Error(), }) return } if roles.Status != database.UserStatusActive { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("user is not active (status = %q), contact an admin to reactivate your account", roles.Status), + Message: fmt.Sprintf("User is not active (status = %q), contact an admin to reactivate your account", roles.Status), }) return } diff --git a/coderd/httpmw/httpmw.go b/coderd/httpmw/httpmw.go index 88964154e8440..c8d5e7690a9d8 100644 --- a/coderd/httpmw/httpmw.go +++ b/coderd/httpmw/httpmw.go @@ -15,7 +15,9 @@ func parseUUID(rw http.ResponseWriter, r *http.Request, param string) (uuid.UUID rawID := chi.URLParam(r, param) if rawID == "" { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("%q must be provided", param), + Message: "Missing uuid in url", + // Url params mean nothing to a user + Internal: fmt.Sprintf("%q url param missing", param), }) return uuid.UUID{}, false } @@ -23,7 +25,8 @@ func parseUUID(rw http.ResponseWriter, r *http.Request, param string) (uuid.UUID parsed, err := uuid.Parse(rawID) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("%q must be a uuid", param), + Message: fmt.Sprintf("Invalid uuid %q", param), + Internal: err.Error(), }) return uuid.UUID{}, false } diff --git a/coderd/httpmw/oauth2.go b/coderd/httpmw/oauth2.go index 92ba5da38162b..be5d8880b59c6 100644 --- a/coderd/httpmw/oauth2.go +++ b/coderd/httpmw/oauth2.go @@ -63,7 +63,8 @@ func ExtractOAuth2(config OAuth2Config) func(http.Handler) http.Handler { state, err := cryptorand.String(32) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("generate state string: %s", err), + Message: "Internal error generating state string", + Internal: err.Error(), }) return } @@ -91,7 +92,7 @@ func ExtractOAuth2(config OAuth2Config) func(http.Handler) http.Handler { if state == "" { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "state must be provided", + Message: "State must be provided", }) return } @@ -99,13 +100,13 @@ func ExtractOAuth2(config OAuth2Config) func(http.Handler) http.Handler { stateCookie, err := r.Cookie(oauth2StateCookieName) if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("%q cookie must be provided", oauth2StateCookieName), + Message: fmt.Sprintf("Cookie %q must be provided", oauth2StateCookieName), }) return } if stateCookie.Value != state { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "state mismatched", + Message: "State mismatched", }) return } @@ -119,7 +120,8 @@ func ExtractOAuth2(config OAuth2Config) func(http.Handler) http.Handler { oauthToken, err := config.Exchange(r.Context(), code) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("exchange oauth code: %s", err), + Message: "Internal error exchanging oauth code", + Internal: err.Error(), }) return } diff --git a/coderd/httpmw/organizationparam.go b/coderd/httpmw/organizationparam.go index 1bac16d4a7c18..5cd8519255e2a 100644 --- a/coderd/httpmw/organizationparam.go +++ b/coderd/httpmw/organizationparam.go @@ -46,13 +46,14 @@ func ExtractOrganizationParam(db database.Store) func(http.Handler) http.Handler organization, err := db.GetOrganizationByID(r.Context(), orgID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: fmt.Sprintf("organization %q does not exist", orgID), + Message: fmt.Sprintf("Organization %q does not exist", orgID), }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get organization: %s", err.Error()), + Message: "Internal error fetching organization", + Internal: err.Error(), }) return } @@ -76,13 +77,14 @@ func ExtractOrganizationMemberParam(db database.Store) func(http.Handler) http.H }) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusForbidden, httpapi.Response{ - Message: "not a member of the organization", + Message: "Not a member of the organization", }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get organization member: %s", err.Error()), + Message: "Internal error fetching organization member", + Internal: err.Error(), }) return } diff --git a/coderd/httpmw/templateparam.go b/coderd/httpmw/templateparam.go index f5d1ffcef127a..6a434d3459155 100644 --- a/coderd/httpmw/templateparam.go +++ b/coderd/httpmw/templateparam.go @@ -35,19 +35,20 @@ func ExtractTemplateParam(db database.Store) func(http.Handler) http.Handler { template, err := db.GetTemplateByID(r.Context(), templateID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: fmt.Sprintf("template %q does not exist", templateID), + Message: fmt.Sprintf("Template %q does not exist", templateID), }) } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template: %s", err), + Message: "Internal error fetching template", + Internal: err.Error(), }) return } if template.Deleted { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: fmt.Sprintf("template %q does not exist", templateID), + Message: fmt.Sprintf("Template %q does not exist", templateID), }) return } diff --git a/coderd/httpmw/templateversionparam.go b/coderd/httpmw/templateversionparam.go index a1d708d4aa564..bf220811a9384 100644 --- a/coderd/httpmw/templateversionparam.go +++ b/coderd/httpmw/templateversionparam.go @@ -35,13 +35,14 @@ func ExtractTemplateVersionParam(db database.Store) func(http.Handler) http.Hand templateVersion, err := db.GetTemplateVersionByID(r.Context(), templateVersionID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: fmt.Sprintf("template version %q does not exist", templateVersionID), + Message: fmt.Sprintf("Template version %q does not exist", templateVersionID), }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template version: %s", err.Error()), + Message: "Internal error fetching template version", + Internal: err.Error(), }) return } diff --git a/coderd/httpmw/userparam.go b/coderd/httpmw/userparam.go index 16e768c4ba8c8..688ad084462f6 100644 --- a/coderd/httpmw/userparam.go +++ b/coderd/httpmw/userparam.go @@ -2,7 +2,6 @@ package httpmw import ( "context" - "fmt" "net/http" "github.com/go-chi/chi/v5" @@ -50,7 +49,8 @@ func ExtractUserParam(db database.Store) func(http.Handler) http.Handler { user, err = db.GetUserByID(r.Context(), APIKey(r).UserID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get user: %s", err.Error()), + Message: "Internal error fetching user", + Internal: err.Error(), }) return } diff --git a/coderd/httpmw/workspaceagent.go b/coderd/httpmw/workspaceagent.go index 8bcf10f086285..a8b944a84b9f6 100644 --- a/coderd/httpmw/workspaceagent.go +++ b/coderd/httpmw/workspaceagent.go @@ -31,14 +31,14 @@ func ExtractWorkspaceAgent(db database.Store) func(http.Handler) http.Handler { cookie, err := r.Cookie(SessionTokenKey) if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("%q cookie must be provided", SessionTokenKey), + Message: fmt.Sprintf("Cookie %q must be provided", SessionTokenKey), }) return } token, err := uuid.Parse(cookie.Value) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("parse token %q: %s", cookie.Value, err), + Message: fmt.Sprintf("Parse token %q: %s", cookie.Value, err), }) return } @@ -46,14 +46,15 @@ func ExtractWorkspaceAgent(db database.Store) func(http.Handler) http.Handler { if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "agent token is invalid", + Message: "Agent token is invalid", }) return } } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace agent: %s", err), + Message: "Internal error fetching workspace agent", + Internal: err.Error(), }) return } diff --git a/coderd/httpmw/workspaceagentparam.go b/coderd/httpmw/workspaceagentparam.go index de2b499e9b76d..79c67cdfd41c0 100644 --- a/coderd/httpmw/workspaceagentparam.go +++ b/coderd/httpmw/workspaceagentparam.go @@ -4,7 +4,6 @@ import ( "context" "database/sql" "errors" - "fmt" "net/http" "github.com/coder/coder/coderd/database" @@ -33,20 +32,22 @@ func ExtractWorkspaceAgentParam(db database.Store) func(http.Handler) http.Handl agent, err := db.GetWorkspaceAgentByID(r.Context(), agentUUID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: "agent doesn't exist with that id", + Message: "Agent doesn't exist with that id", }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get agent: %s", err), + Message: "Internal error fetching workspace agent", + Internal: err.Error(), }) return } resource, err := db.GetWorkspaceResourceByID(r.Context(), agent.ResourceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get resource: %s", err), + Message: "Internal error fetching workspace resource", + Internal: err.Error(), }) return } @@ -54,7 +55,8 @@ func ExtractWorkspaceAgentParam(db database.Store) func(http.Handler) http.Handl job, err := db.GetProvisionerJobByID(r.Context(), resource.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -67,14 +69,16 @@ func ExtractWorkspaceAgentParam(db database.Store) func(http.Handler) http.Handl build, err := db.GetWorkspaceBuildByJobID(r.Context(), job.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace build: %s", err), + Message: "Internal error fetching workspace build", + Internal: err.Error(), }) return } workspace, err := db.GetWorkspaceByID(r.Context(), build.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace: %s", err), + Message: "Internal error fetching workspace", + Internal: err.Error(), }) return } @@ -82,7 +86,7 @@ func ExtractWorkspaceAgentParam(db database.Store) func(http.Handler) http.Handl apiKey := APIKey(r) if apiKey.UserID != workspace.OwnerID { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "getting non-personal agents isn't supported", + Message: "Getting non-personal agents isn't supported", }) return } diff --git a/coderd/httpmw/workspacebuildparam.go b/coderd/httpmw/workspacebuildparam.go index 62d4a00efdf09..3f00fe8c0cd15 100644 --- a/coderd/httpmw/workspacebuildparam.go +++ b/coderd/httpmw/workspacebuildparam.go @@ -35,13 +35,14 @@ func ExtractWorkspaceBuildParam(db database.Store) func(http.Handler) http.Handl workspaceBuild, err := db.GetWorkspaceBuildByID(r.Context(), workspaceBuildID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: fmt.Sprintf("workspace build %q does not exist", workspaceBuildID), + Message: fmt.Sprintf("Workspace build %q does not exist", workspaceBuildID), }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace build: %s", err.Error()), + Message: "Internal error fetching workspace build", + Internal: err.Error(), }) return } diff --git a/coderd/httpmw/workspaceparam.go b/coderd/httpmw/workspaceparam.go index ca1daa0e4d770..2cd2084e44f2d 100644 --- a/coderd/httpmw/workspaceparam.go +++ b/coderd/httpmw/workspaceparam.go @@ -33,13 +33,14 @@ func ExtractWorkspaceParam(db database.Store) func(http.Handler) http.Handler { workspace, err := db.GetWorkspaceByID(r.Context(), workspaceID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: fmt.Sprintf("workspace %q does not exist", workspaceID), + Message: fmt.Sprintf("Workspace %q does not exist", workspaceID), }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace: %s", err.Error()), + Message: "Internal error fetching workspace", + Internal: err.Error(), }) return } diff --git a/coderd/httpmw/workspaceresourceparam.go b/coderd/httpmw/workspaceresourceparam.go index 49e0b8f20a97f..6e6489160fa21 100644 --- a/coderd/httpmw/workspaceresourceparam.go +++ b/coderd/httpmw/workspaceresourceparam.go @@ -4,7 +4,6 @@ import ( "context" "database/sql" "errors" - "fmt" "net/http" "github.com/go-chi/chi/v5" @@ -35,13 +34,14 @@ func ExtractWorkspaceResourceParam(db database.Store) func(http.Handler) http.Ha resource, err := db.GetWorkspaceResourceByID(r.Context(), resourceUUID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: "resource doesn't exist with that id", + Message: "Resource doesn't exist with that id", }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner resource: %s", err), + Message: "Internal error fetching provisioner resource", + Internal: err.Error(), }) return } @@ -49,7 +49,8 @@ func ExtractWorkspaceResourceParam(db database.Store) func(http.Handler) http.Ha job, err := db.GetProvisionerJobByID(r.Context(), resource.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error provisioner job", + Internal: err.Error(), }) return } @@ -62,7 +63,8 @@ func ExtractWorkspaceResourceParam(db database.Store) func(http.Handler) http.Ha build, err := db.GetWorkspaceBuildByJobID(r.Context(), job.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace build: %s", err), + Message: "Internal error workspace build", + Internal: err.Error(), }) return } diff --git a/coderd/users.go b/coderd/users.go index fdfeb9756523c..8f6f83e675926 100644 --- a/coderd/users.go +++ b/coderd/users.go @@ -30,7 +30,8 @@ func (api *API) firstUser(rw http.ResponseWriter, r *http.Request) { userCount, err := api.Database.GetUserCount(r.Context()) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get user count: %s", err.Error()), + Message: "Internal error fetching user count", + Internal: err.Error(), }) return } @@ -58,7 +59,8 @@ func (api *API) postFirstUser(rw http.ResponseWriter, r *http.Request) { userCount, err := api.Database.GetUserCount(r.Context()) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get user count: %s", err.Error()), + Message: "Internal error fetching user count", + Internal: err.Error(), }) return } @@ -66,7 +68,7 @@ func (api *API) postFirstUser(rw http.ResponseWriter, r *http.Request) { // If a user already exists, the initial admin user no longer can be created. if userCount != 0 { httpapi.Write(rw, http.StatusConflict, httpapi.Response{ - Message: "the initial user has already been created", + Message: "The initial user has already been created", }) return } @@ -78,7 +80,8 @@ func (api *API) postFirstUser(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: err.Error(), + Message: "Internal error creating user", + Internal: err.Error(), }) return } @@ -93,7 +96,8 @@ func (api *API) postFirstUser(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: err.Error(), + Message: "Internal error updating user's roles", + Internal: err.Error(), }) return } @@ -121,6 +125,9 @@ func (api *API) users(rw http.ResponseWriter, r *http.Request) { default: httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: fmt.Sprintf("%q is not a valid user status", filter), + Errors: []httpapi.Error{ + {Field: "status", Detail: "invalid status"}, + }, }) return } @@ -150,7 +157,8 @@ func (api *API) users(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: err.Error(), + Message: "Internal error fetching users", + Internal: err.Error(), }) return } @@ -165,7 +173,8 @@ func (api *API) users(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: err.Error(), + Message: "Internal error fetching user's organizations", + Internal: err.Error(), }) return } @@ -204,13 +213,14 @@ func (api *API) postUser(rw http.ResponseWriter, r *http.Request) { }) if err == nil { httpapi.Write(rw, http.StatusConflict, httpapi.Response{ - Message: "user already exists", + Message: "User already exists", }) return } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get user: %s", err), + Message: "Internal error fetching user", + Internal: err.Error(), }) return } @@ -218,13 +228,14 @@ func (api *API) postUser(rw http.ResponseWriter, r *http.Request) { _, err = api.Database.GetOrganizationByID(r.Context(), createUser.OrganizationID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: "organization does not exist with the provided id", + Message: fmt.Sprintf("Organization does not exist with the provided id %q", createUser.OrganizationID) }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get organization: %s", err), + Message: "Internal error fetching organization", + Internal: err.Error(), }) return } @@ -232,7 +243,8 @@ func (api *API) postUser(rw http.ResponseWriter, r *http.Request) { user, _, err := api.createUser(r.Context(), createUser) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: err.Error(), + Message: "Internal error creating user", + Internal: err.Error(), }) return } @@ -252,7 +264,8 @@ func (api *API) userByName(rw http.ResponseWriter, r *http.Request) { if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get organization IDs: %s", err.Error()), + Message: "Internal error fetching user's organizations", + Internal: err.Error(), }) return } @@ -285,14 +298,15 @@ func (api *API) putUserProfile(rw http.ResponseWriter, r *http.Request) { }) } httpapi.Write(rw, http.StatusConflict, httpapi.Response{ - Message: "user already exists", + Message: "User already exists", Errors: responseErrors, }) return } if !errors.Is(err, sql.ErrNoRows) && isDifferentUser { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get user: %s", err), + Message: "Internal error fetching user", + Internal: err.Error(), }) return } @@ -306,7 +320,8 @@ func (api *API) putUserProfile(rw http.ResponseWriter, r *http.Request) { if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("patch user: %s", err.Error()), + Message: "Internal error updating user", + Internal: err.Error(), }) return } @@ -314,7 +329,8 @@ func (api *API) putUserProfile(rw http.ResponseWriter, r *http.Request) { organizationIDs, err := userOrganizationIDs(r.Context(), api, user) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get organization IDs: %s", err.Error()), + Message: "Internal error fetching user's organizations user", + Internal: err.Error(), }) return } @@ -346,7 +362,8 @@ func (api *API) putUserStatus(status database.UserStatus) func(rw http.ResponseW if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("put user suspended: %s", err.Error()), + Message: fmt.Sprintf("Internal error updating user's status to %q", status), + Internal: err.Error(), }) return } @@ -354,7 +371,8 @@ func (api *API) putUserStatus(status database.UserStatus) func(rw http.ResponseW organizations, err := userOrganizationIDs(r.Context(), api, user) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get organization IDs: %s", err.Error()), + Message: "Internal error fetching user's organizations", + Internal: err.Error(), }) return } @@ -381,6 +399,7 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { err := userpassword.Validate(params.Password) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ + Message: "Invalid password", Errors: []httpapi.Error{ { Field: "password", @@ -398,12 +417,14 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { ok, err := userpassword.Compare(string(user.HashedPassword), params.OldPassword) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("compare user password: %s", err.Error()), + Message: "Internal error with passwords", + Internal: err.Error(), }) return } if !ok { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ + Message: "Old password is incorrect", Errors: []httpapi.Error{ { Field: "old_password", @@ -418,7 +439,8 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { hashedPassword, err := userpassword.Hash(params.Password) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("hash password: %s", err.Error()), + Message: "Internal error hashing new password", + Internal: err.Error(), }) return } @@ -428,7 +450,8 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("put user password: %s", err.Error()), + Message: "Internal error updating user's password", + Internal: err.Error(), }) return } @@ -452,7 +475,8 @@ func (api *API) userRoles(rw http.ResponseWriter, r *http.Request) { memberships, err := api.Database.GetOrganizationMembershipsByUserID(r.Context(), user.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get user memberships: %s", err), + Message: "Internal error fetching user's organization memberships", + Internal: err.Error(), }) return } @@ -518,7 +542,8 @@ func (api *API) putUserRoles(rw http.ResponseWriter, r *http.Request) { organizationIDs, err := userOrganizationIDs(r.Context(), api, user) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get organization IDs: %s", err.Error()), + Message: "Internal error fetching user's organizations", + Internal: err.Error(), }) return } @@ -532,7 +557,7 @@ func (api *API) updateSiteUserRoles(ctx context.Context, args database.UpdateUse // Enforce only site wide roles. for _, r := range args.GrantedRoles { if _, ok := rbac.IsOrgRole(r); ok { - return database.User{}, xerrors.Errorf("must only update site wide roles") + return database.User{}, xerrors.Errorf("Must only update site wide roles") } if _, err := rbac.RoleByName(r); err != nil { @@ -558,7 +583,8 @@ func (api *API) organizationsByUser(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get organizations: %s", err.Error()), + Message: "Internal error fetching user's organizations", + Internal: err.Error(), }) return } @@ -610,7 +636,7 @@ func (api *API) postLogin(rw http.ResponseWriter, r *http.Request) { }) if err != nil && !xerrors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get user: %s", err.Error()), + Message: "Internal error", }) return } @@ -619,7 +645,7 @@ func (api *API) postLogin(rw http.ResponseWriter, r *http.Request) { equal, err := userpassword.Compare(string(user.HashedPassword), loginWithPassword.Password) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("compare: %s", err.Error()), + Message: "Internal error", }) } if !equal { @@ -634,7 +660,7 @@ func (api *API) postLogin(rw http.ResponseWriter, r *http.Request) { // If the user logged into a suspended account, reject the login request. if user.Status != database.UserStatusActive { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "You are suspended, contact an admin to reactivate your account", + Message: "You are suspended, contact an admin to reactivate your account.", }) return } @@ -693,7 +719,8 @@ func (api *API) postLogout(rw http.ResponseWriter, r *http.Request) { err := api.Database.DeleteAPIKeyByID(r.Context(), apiKey.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("delete api key: %s", err.Error()), + Message: "Internal error deleting api key", + Internal: err.Error(), }) return } @@ -722,7 +749,8 @@ func (api *API) createAPIKey(rw http.ResponseWriter, r *http.Request, params dat keyID, keySecret, err := generateAPIKeyIDSecret() if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("generate api key parts: %s", err.Error()), + Message: "Internal error generating api key", + Internal: err.Error(), }) return "", false } @@ -754,7 +782,8 @@ func (api *API) createAPIKey(rw http.ResponseWriter, r *http.Request, params dat }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("insert api key: %s", err.Error()), + Message: "Internal error inserting api key", + Internal: err.Error(), }) return "", false } diff --git a/coderd/workspaceagents.go b/coderd/workspaceagents.go index cfcdea0404683..e94cd06082c75 100644 --- a/coderd/workspaceagents.go +++ b/coderd/workspaceagents.go @@ -33,7 +33,8 @@ func (api *API) workspaceAgent(rw http.ResponseWriter, r *http.Request) { apiAgent, err := convertWorkspaceAgent(workspaceAgent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("convert workspace agent: %s", err), + Message: "Internal error reading workspace agent", + Internal: err.Error(), }) return } @@ -51,7 +52,8 @@ func (api *API) workspaceAgentDial(rw http.ResponseWriter, r *http.Request) { apiAgent, err := convertWorkspaceAgent(workspaceAgent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("convert workspace agent: %s", err), + Message: "Internal error reading workspace agent", + Internal: err.Error(), }) return } @@ -65,7 +67,8 @@ func (api *API) workspaceAgentDial(rw http.ResponseWriter, r *http.Request) { conn, err := websocket.Accept(rw, r, nil) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("accept websocket: %s", err), + Message: "Failed to accept websocket", + Internal: err.Error(), }) return } @@ -95,35 +98,40 @@ func (api *API) workspaceAgentMetadata(rw http.ResponseWriter, r *http.Request) apiAgent, err := convertWorkspaceAgent(workspaceAgent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("convert workspace agent: %s", err), + Message: "Internal error reading workspace agent", + Internal: err.Error(), }) return } resource, err := api.Database.GetWorkspaceResourceByID(r.Context(), workspaceAgent.ResourceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace resource: %s", err), + Message: "Internal error fetching workspace resources", + Internal: err.Error(), }) return } build, err := api.Database.GetWorkspaceBuildByJobID(r.Context(), resource.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace build: %s", err), + Message: "Internal error fetching workspace build", + Internal: err.Error(), }) return } workspace, err := api.Database.GetWorkspaceByID(r.Context(), build.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace build: %s", err), + Message: "Internal error fetching workspace", + Internal: err.Error(), }) return } owner, err := api.Database.GetUserByID(r.Context(), workspace.OwnerID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace build: %s", err), + Message: "Internal error fetching workspace owner", + Internal: err.Error(), }) return } @@ -148,14 +156,16 @@ func (api *API) workspaceAgentListen(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("accept websocket: %s", err), + Message: "Failed to accept websocket", + Internal: err.Error(), }) return } resource, err := api.Database.GetWorkspaceResourceByID(r.Context(), workspaceAgent.ResourceID) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("accept websocket: %s", err), + Message: "Internal error fetching workspace resources", + Internal: err.Error(), }) return } @@ -288,7 +298,8 @@ func (api *API) workspaceAgentTurn(rw http.ResponseWriter, r *http.Request) { host, port, err := net.SplitHostPort(r.RemoteAddr) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("get remote address: %s", err), + Message: "Invalid remote address", + Internal: err.Error(), }) return } @@ -296,7 +307,8 @@ func (api *API) workspaceAgentTurn(rw http.ResponseWriter, r *http.Request) { remoteAddress.Port, err = strconv.Atoi(port) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("remote address %q has no parsable port: %s", r.RemoteAddr, err), + Message: fmt.Sprintf("Remote address %q has no parsable port, must be an integer.", r.RemoteAddr), + Internal: err.Error(), }) return } @@ -306,7 +318,8 @@ func (api *API) workspaceAgentTurn(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("accept websocket: %s", err), + Message: "Failed to accept websocket", + Internal: err.Error(), }) return } @@ -334,13 +347,14 @@ func (api *API) workspaceAgentPTY(rw http.ResponseWriter, r *http.Request) { apiAgent, err := convertWorkspaceAgent(workspaceAgent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("convert workspace agent: %s", err), + Message: "Internal error reading workspace agent", + Internal: err.Error(), }) return } if apiAgent.Status != codersdk.WorkspaceAgentConnected { httpapi.Write(rw, http.StatusPreconditionRequired, httpapi.Response{ - Message: fmt.Sprintf("agent must be in the connected state: %s", apiAgent.Status), + Message: fmt.Sprintf("Agent state it %q, it must be in the %q state.", apiAgent.Status, codersdk.WorkspaceAgentConnected), }) return } @@ -348,7 +362,11 @@ func (api *API) workspaceAgentPTY(rw http.ResponseWriter, r *http.Request) { reconnect, err := uuid.Parse(r.URL.Query().Get("reconnect")) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("reconnection must be a uuid: %s", err), + Message: "Query param 'reconnect' must be a valid uuid", + Internal: err.Error(), + Errors: []httpapi.Error{ + {Field: "reconnect", Detail: "invalid uuid"}, + }, }) return } @@ -366,7 +384,8 @@ func (api *API) workspaceAgentPTY(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("accept websocket: %s", err), + Message: "Failed to accept websocket", + Internal: err.Error(), }) return } diff --git a/coderd/workspacebuilds.go b/coderd/workspacebuilds.go index 50d60b34cb604..4019441e26067 100644 --- a/coderd/workspacebuilds.go +++ b/coderd/workspacebuilds.go @@ -31,7 +31,8 @@ func (api *API) workspaceBuild(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -62,12 +63,13 @@ func (api *API) workspaceBuilds(rw http.ResponseWriter, r *http.Request) { _, err := store.GetWorkspaceBuildByID(r.Context(), paginationParams.AfterID) if err != nil && xerrors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("record at \"after_id\" (%q) does not exist", paginationParams.AfterID.String()), + Message: fmt.Sprintf("Record at \"after_id\" (%q) does not exist", paginationParams.AfterID.String()), }) return err } else if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace build at after_id: %s", err), + Message: "Internal error fetching workspace build at \"after_id\"", + Internal: err.Error(), }) return err } @@ -85,7 +87,8 @@ func (api *API) workspaceBuilds(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace builds: %s", err), + Message: "Internal error fetching workspace build", + Internal: err.Error(), }) return err } @@ -106,7 +109,8 @@ func (api *API) workspaceBuilds(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get jobs: %s", err), + Message: "Internal error fetching provisioner jobs", + Internal: err.Error(), }) return } @@ -120,7 +124,7 @@ func (api *API) workspaceBuilds(rw http.ResponseWriter, r *http.Request) { job, exists := jobByID[build.JobID.String()] if !exists { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("job %q doesn't exist for build %q", build.JobID, build.ID), + Message: fmt.Sprintf("Job %q doesn't exist for build %q", build.JobID, build.ID), }) return } @@ -144,20 +148,22 @@ func (api *API) workspaceBuildByName(rw http.ResponseWriter, r *http.Request) { }) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: fmt.Sprintf("no workspace build found by name %q", workspaceBuildName), + Message: fmt.Sprintf("No workspace build found by name %q", workspaceBuildName), }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace build by name: %s", err), + Message: "Internal error fetching workspace build by name", + Internal: err.Error(), }) return } job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -182,7 +188,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { action = rbac.ActionUpdate default: httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("transition not supported: %q", createBuild.Transition), + Message: fmt.Sprintf("Transition %q not supported", createBuild.Transition), }) return } @@ -195,7 +201,8 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { latestBuild, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), workspace.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get latest workspace build: %s", err), + Message: "Internal error the latest workspace build", + Internal: err.Error(), }) return } @@ -204,7 +211,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { templateVersion, err := api.Database.GetTemplateVersionByID(r.Context(), createBuild.TemplateVersionID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "template version not found", + Message: "Template version not found", Errors: []httpapi.Error{{ Field: "template_version_id", Detail: "template version not found", @@ -214,14 +221,16 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template version: %s", err), + Message: "Internal error fetching template version", + Internal: err.Error(), }) return } templateVersionJob, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -247,7 +256,8 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { template, err := api.Database.GetTemplateByID(r.Context(), templateVersion.TemplateID.UUID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template: %s", err), + Message: "Internal error fetching template job", + Internal: err.Error(), }) return } @@ -259,7 +269,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { priorJob, err := api.Database.GetProvisionerJobByID(r.Context(), priorHistory.JobID) if err == nil && convertProvisionerJob(priorJob).Status.Active() { httpapi.Write(rw, http.StatusConflict, httpapi.Response{ - Message: "a workspace build is already active", + Message: "A workspace build is already active", }) return } @@ -267,7 +277,8 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { priorBuildNum = priorHistory.BuildNumber } else if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get prior workspace build: %s", err), + Message: "Internal error fetching prior workspace build", + Internal: err.Error(), }) return } @@ -325,7 +336,8 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: err.Error(), + Message: "Internal error inserting workspace build", + Internal: err.Error(), }) return } @@ -339,7 +351,7 @@ func (api *API) patchCancelWorkspaceBuild(rw http.ResponseWriter, r *http.Reques workspace, err := api.Database.GetWorkspaceByID(r.Context(), workspaceBuild.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "no workspace exists for this job", + Message: "No workspace exists for this job", }) return } @@ -352,7 +364,8 @@ func (api *API) patchCancelWorkspaceBuild(rw http.ResponseWriter, r *http.Reques job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -377,7 +390,8 @@ func (api *API) patchCancelWorkspaceBuild(rw http.ResponseWriter, r *http.Reques }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("update provisioner job: %s", err), + Message: "Internal error updating provisioner job", + Internal: err.Error(), }) return } @@ -391,7 +405,7 @@ func (api *API) workspaceBuildResources(rw http.ResponseWriter, r *http.Request) workspace, err := api.Database.GetWorkspaceByID(r.Context(), workspaceBuild.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "no workspace exists for this job", + Message: "No workspace exists for this job", }) return } @@ -404,7 +418,8 @@ func (api *API) workspaceBuildResources(rw http.ResponseWriter, r *http.Request) job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -416,7 +431,7 @@ func (api *API) workspaceBuildLogs(rw http.ResponseWriter, r *http.Request) { workspace, err := api.Database.GetWorkspaceByID(r.Context(), workspaceBuild.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "no workspace exists for this job", + Message: "No workspace exists for this job", }) return } @@ -429,7 +444,8 @@ func (api *API) workspaceBuildLogs(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -441,7 +457,7 @@ func (api *API) workspaceBuildState(rw http.ResponseWriter, r *http.Request) { workspace, err := api.Database.GetWorkspaceByID(r.Context(), workspaceBuild.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "no workspace exists for this job", + Message: "No workspace exists for this job", }) return } diff --git a/coderd/workspaceresourceauth.go b/coderd/workspaceresourceauth.go index e403271e01645..0d2621acd4a95 100644 --- a/coderd/workspaceresourceauth.go +++ b/coderd/workspaceresourceauth.go @@ -26,7 +26,8 @@ func (api *API) postWorkspaceAuthAzureInstanceIdentity(rw http.ResponseWriter, r instanceID, err := azureidentity.Validate(r.Context(), req.Signature, api.AzureCertificates) if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("validate: %s", err), + Message: "Invalid azure identity", + Internal: err.Error(), }) return } @@ -44,7 +45,8 @@ func (api *API) postWorkspaceAuthAWSInstanceIdentity(rw http.ResponseWriter, r * identity, err := awsidentity.Validate(req.Signature, req.Document, api.AWSCertificates) if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("validate: %s", err), + Message: "Invalid aws identity", + Internal: err.Error(), }) return } @@ -64,7 +66,8 @@ func (api *API) postWorkspaceAuthGoogleInstanceIdentity(rw http.ResponseWriter, payload, err := api.GoogleTokenValidator.Validate(r.Context(), req.JSONWebToken, "") if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("validate: %s", err), + Message: "Invalid gcp identity", + Internal: err.Error(), }) return } @@ -78,7 +81,8 @@ func (api *API) postWorkspaceAuthGoogleInstanceIdentity(rw http.ResponseWriter, err = mapstructure.Decode(payload.Claims, &claims) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("decode jwt claims: %s", err), + Message: "Error decoding jwt claims", + Internal: err.Error(), }) return } @@ -89,27 +93,30 @@ func (api *API) handleAuthInstanceID(rw http.ResponseWriter, r *http.Request, in agent, err := api.Database.GetWorkspaceAgentByInstanceID(r.Context(), instanceID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: fmt.Sprintf("instance with id %q not found", instanceID), + Message: fmt.Sprintf("Instance with id %q not found", instanceID), }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job agent: %s", err), + Message: "Internal error fetching provisioner job agent", + Internal: err.Error(), }) return } resource, err := api.Database.GetWorkspaceResourceByID(r.Context(), agent.ResourceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job resource: %s", err), + Message: "Internal error fetching provisioner job resource", + Internal: err.Error(), }) return } job, err := api.Database.GetProvisionerJobByID(r.Context(), resource.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -123,14 +130,16 @@ func (api *API) handleAuthInstanceID(rw http.ResponseWriter, r *http.Request, in err = json.Unmarshal(job.Input, &jobData) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("extract job data: %s", err), + Message: "Internal error extracting job data", + Internal: err.Error(), }) return } resourceHistory, err := api.Database.GetWorkspaceBuildByID(r.Context(), jobData.WorkspaceBuildID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace build: %s", err), + Message: "Internal error fetching workspace build", + Internal: err.Error(), }) return } @@ -140,13 +149,14 @@ func (api *API) handleAuthInstanceID(rw http.ResponseWriter, r *http.Request, in latestHistory, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), resourceHistory.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get latest workspace build: %s", err), + Message: "Internal error the latest workspace build", + Internal: err.Error(), }) return } if latestHistory.ID != resourceHistory.ID { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("resource found for id %q, but isn't registered on the latest history", instanceID), + Message: fmt.Sprintf("Resource found for id %q, but isn't registered on the latest history", instanceID), }) return } diff --git a/coderd/workspaceresources.go b/coderd/workspaceresources.go index a08861971e60e..dcf99bb4de6f5 100644 --- a/coderd/workspaceresources.go +++ b/coderd/workspaceresources.go @@ -3,7 +3,6 @@ package coderd import ( "database/sql" "errors" - "fmt" "net/http" "github.com/google/uuid" @@ -25,7 +24,8 @@ func (api *API) workspaceResource(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } @@ -41,7 +41,8 @@ func (api *API) workspaceResource(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job agents: %s", err), + Message: "Internal error fetching provisioner job agents", + Internal: err.Error(), }) return } @@ -50,7 +51,8 @@ func (api *API) workspaceResource(rw http.ResponseWriter, r *http.Request) { convertedAgent, err := convertWorkspaceAgent(agent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("convert provisioner job agent: %s", err), + Message: "Internal error reading workspace agent", + Internal: err.Error(), }) return } diff --git a/coderd/workspaces.go b/coderd/workspaces.go index 43c39140a7e53..aa42ff0201a22 100644 --- a/coderd/workspaces.go +++ b/coderd/workspaces.go @@ -46,20 +46,23 @@ func (api *API) workspace(rw http.ResponseWriter, r *http.Request) { showDeleted, err = strconv.ParseBool(deletedStr) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("invalid bool for 'deleted' query param: %s", err), + Message: fmt.Sprintf("Invalid boolean value %q for \"deleted\" query param", deletedStr), + Errors: []httpapi.Error{ + {Field: "deleted", Detail: "Must be a valid boolean"}, + }, }) return } } if workspace.Deleted && !showDeleted { httpapi.Write(rw, http.StatusGone, httpapi.Response{ - Message: fmt.Sprintf("workspace %q was deleted, you can view this workspace by specifying '?deleted=true' and trying again", workspace.ID.String()), + Message: fmt.Sprintf("Workspace %q was deleted, you can view this workspace by specifying '?deleted=true' and trying again", workspace.ID.String()), }) return } if !workspace.Deleted && showDeleted { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("workspace %q is not deleted, please remove '?deleted=true' and try again", workspace.ID.String()), + Message: fmt.Sprintf("Workspace %q is not deleted, please remove '?deleted=true' and try again", workspace.ID.String()), }) return } @@ -67,7 +70,8 @@ func (api *API) workspace(rw http.ResponseWriter, r *http.Request) { build, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), workspace.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace build: %s", err), + Message: "Internal error fetching workspace build", + Internal: err.Error(), }) return } @@ -92,7 +96,8 @@ func (api *API) workspace(rw http.ResponseWriter, r *http.Request) { err = group.Wait() if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("fetch resource: %s", err), + Message: "Internal error fetching resource", + Internal: err.Error(), }) return } @@ -111,7 +116,8 @@ func (api *API) workspacesByOrganization(rw http.ResponseWriter, r *http.Request } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspaces: %s", err), + Message: "Internal error fetching workspaces", + Internal: err.Error(), }) return } @@ -122,7 +128,8 @@ func (api *API) workspacesByOrganization(rw http.ResponseWriter, r *http.Request apiWorkspaces, err := convertWorkspaces(r.Context(), api.Database, workspaces) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("convert workspaces: %s", err), + Message: "Internal error reading workspaces", + Internal: err.Error(), }) return } @@ -143,7 +150,11 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { orgID, err := uuid.Parse(orgFilter) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("organization_id must be a uuid: %s", err.Error()), + Message: "Query param \"organization_id\" must be a valid uuid", + Internal: err.Error(), + Errors: []httpapi.Error{ + {Field: "organization_id", Detail: "Must be a valid uuid"}, + }, }) return } @@ -162,7 +173,11 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "owner must be a uuid or username", + Message: "Query param \"owner\" must be a valid uuid or username", + Internal: err.Error(), + Errors: []httpapi.Error{ + {Field: "owner", Detail: "Must be a valid uuid or username"}, + }, }) return } @@ -174,7 +189,8 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { workspaces, err := api.Database.GetWorkspacesWithFilter(r.Context(), filter) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspaces for user: %s", err), + Message: "Internal error fetching workspaces", + Internal: err.Error(), }) return } @@ -185,7 +201,8 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { apiWorkspaces, err := convertWorkspaces(r.Context(), api.Database, workspaces) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("convert workspaces: %s", err), + Message: "Internal error reading workspaces", + Internal: err.Error(), }) return } @@ -203,7 +220,8 @@ func (api *API) workspacesByOwner(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspaces: %s", err), + Message: "Internal error fetching workspaces", + Internal: err.Error(), }) return } @@ -214,7 +232,8 @@ func (api *API) workspacesByOwner(rw http.ResponseWriter, r *http.Request) { apiWorkspaces, err := convertWorkspaces(r.Context(), api.Database, workspaces) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("convert workspaces: %s", err), + Message: "Internal error reading workspaces", + Internal: err.Error(), }) return } @@ -237,14 +256,15 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request) } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace by name: %s", err), + Message: "Internal error fetching workspace by name", + Internal: err.Error(), }) return } if workspace.OrganizationID != organization.ID { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("workspace is not owned by organization %q", organization.Name), + Message: fmt.Sprintf("Workspace is not owned by organization %q", organization.Name), }) return } @@ -256,21 +276,24 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request) build, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), workspace.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace build: %s", err), + Message: "Internal error fetching workspace build", + Internal: err.Error(), }) return } job, err := api.Database.GetProvisionerJobByID(r.Context(), build.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get provisioner job: %s", err), + Message: "Internal error fetching provisioner job", + Internal: err.Error(), }) return } template, err := api.Database.GetTemplateByID(r.Context(), workspace.TemplateID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template: %s", err), + Message: "Internal error fetching template", + Internal: err.Error(), }) return } @@ -295,7 +318,7 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req template, err := api.Database.GetTemplateByID(r.Context(), createWorkspace.TemplateID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("template %q doesn't exist", createWorkspace.TemplateID.String()), + Message: fmt.Sprintf("Template %q doesn't exist", createWorkspace.TemplateID.String()), Errors: []httpapi.Error{{ Field: "template_id", Detail: "template not found", @@ -305,14 +328,15 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template: %s", err), + Message: "Internal error fetching template", + Internal: err.Error(), }) return } if organization.ID != template.OrganizationID { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("template is not in organization %q", organization.Name), + Message: fmt.Sprintf("Template is not in organization %q", organization.Name), }) return } @@ -322,13 +346,14 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req }) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "you aren't allowed to access templates in that organization", + Message: "You aren't allowed to access templates in that organization", }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get organization member: %s", err), + Message: "Internal error fetching organization member", + Internal: err.Error(), }) return } @@ -338,7 +363,8 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req _, err := schedule.Weekly(*createWorkspace.AutostartSchedule) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("parse autostart schedule: %s", err.Error()), + Message: "Error parsing autostart schedule", + Internal: err.Error(), }) return } @@ -349,7 +375,8 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req dbTTL, err := validWorkspaceTTLMillis(createWorkspace.TTLMillis) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "validate workspace ttl", + Message: "Invalid workspace ttl", + Internal: err.Error(), Errors: []httpapi.Error{ { Field: "ttl", @@ -369,13 +396,14 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req template, err := api.Database.GetTemplateByID(r.Context(), workspace.TemplateID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("find template for conflicting workspace name %q: %s", createWorkspace.Name, err), + Message: fmt.Sprintf("Find template for conflicting workspace name %q", createWorkspace.Name), + Internal: err.Error(), }) return } // The template is fetched for clarity to the user on where the conflicting name may be. httpapi.Write(rw, http.StatusConflict, httpapi.Response{ - Message: fmt.Sprintf("workspace %q already exists in the %q template", createWorkspace.Name, template.Name), + Message: fmt.Sprintf("Workspace %q already exists in the %q template", createWorkspace.Name, template.Name), Errors: []httpapi.Error{{ Field: "name", Detail: "this value is already in use and should be unique", @@ -385,7 +413,8 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get workspace by name: %s", err.Error()), + Message: fmt.Sprintf("Internal error fetching workspace by name %q", createWorkspace.Name), + Internal: err.Error(), }) return } @@ -393,14 +422,16 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req templateVersion, err := api.Database.GetTemplateVersionByID(r.Context(), template.ActiveVersionID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template version: %s", err), + Message: "Internal error fetching template version", + Internal: err.Error(), }) return } templateVersionJob, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get template version job: %s", err), + Message: "Internal error fetching template version job", + Internal: err.Error(), }) return } @@ -501,14 +532,16 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("create workspace: %s", err), + Message: "Internal error creating workspace", + Internal: err.Error(), }) return } user, err := api.Database.GetUserByID(r.Context(), apiKey.UserID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("get user: %s", err), + Message: "Internal error fetching user", + Internal: err.Error(), }) return } @@ -531,7 +564,8 @@ func (api *API) putWorkspaceAutostart(rw http.ResponseWriter, r *http.Request) { dbSched, err := validWorkspaceSchedule(req.Schedule) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("invalid autostart schedule: %s", err), + Message: "Invalid autostart schedule", + Internal: err.Error(), }) return } @@ -542,7 +576,8 @@ func (api *API) putWorkspaceAutostart(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("update workspace autostart schedule: %s", err), + Message: "Internal error updating workspace autostart schedule", + Internal: err.Error(), }) return } @@ -563,7 +598,8 @@ func (api *API) putWorkspaceTTL(rw http.ResponseWriter, r *http.Request) { dbTTL, err := validWorkspaceTTLMillis(req.TTLMillis) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "validate workspace ttl", + Message: "Invalid workspace ttl", + Internal: err.Error(), Errors: []httpapi.Error{ { Field: "ttl", @@ -580,7 +616,8 @@ func (api *API) putWorkspaceTTL(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("update workspace ttl: %s", err), + Message: "Internal error updating workspace ttl", + Internal: err.Error(), }) return } @@ -692,14 +729,16 @@ func (api *API) watchWorkspace(rw http.ResponseWriter, r *http.Request) { workspace, err := api.Database.GetWorkspaceByID(r.Context(), workspace.ID) if err != nil { _ = wsjson.Write(ctx, c, httpapi.Response{ - Message: fmt.Sprintf("get workspace: %s", err), + Message: "Internal error fetching workspace", + Internal: err.Error(), }) return } build, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), workspace.ID) if err != nil { _ = wsjson.Write(ctx, c, httpapi.Response{ - Message: fmt.Sprintf("get workspace build: %s", err), + Message: "Internal error fetching workspace build", + Internal: err.Error(), }) return } @@ -724,7 +763,8 @@ func (api *API) watchWorkspace(rw http.ResponseWriter, r *http.Request) { err = group.Wait() if err != nil { _ = wsjson.Write(ctx, c, httpapi.Response{ - Message: fmt.Sprintf("fetch resource: %s", err), + Message: "Internal error fetching resource", + Internal: err.Error(), }) return } From 1592d082645e09371d6d3aaec631277c6d132d5e Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 09:34:09 -0500 Subject: [PATCH 04/21] Fix typo --- coderd/users.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/coderd/users.go b/coderd/users.go index 8f6f83e675926..ee01dcea72bb3 100644 --- a/coderd/users.go +++ b/coderd/users.go @@ -157,7 +157,7 @@ func (api *API) users(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching users", + Message: "Internal error fetching users", Internal: err.Error(), }) return @@ -173,7 +173,7 @@ func (api *API) users(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's organizations", + Message: "Internal error fetching user's organizations", Internal: err.Error(), }) return @@ -228,7 +228,7 @@ func (api *API) postUser(rw http.ResponseWriter, r *http.Request) { _, err = api.Database.GetOrganizationByID(r.Context(), createUser.OrganizationID) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: fmt.Sprintf("Organization does not exist with the provided id %q", createUser.OrganizationID) + Message: fmt.Sprintf("Organization does not exist with the provided id %q", createUser.OrganizationID), }) return } @@ -264,7 +264,7 @@ func (api *API) userByName(rw http.ResponseWriter, r *http.Request) { if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's organizations", + Message: "Internal error fetching user's organizations", Internal: err.Error(), }) return @@ -305,7 +305,7 @@ func (api *API) putUserProfile(rw http.ResponseWriter, r *http.Request) { } if !errors.Is(err, sql.ErrNoRows) && isDifferentUser { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user", + Message: "Internal error fetching user", Internal: err.Error(), }) return @@ -320,7 +320,7 @@ func (api *API) putUserProfile(rw http.ResponseWriter, r *http.Request) { if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error updating user", + Message: "Internal error updating user", Internal: err.Error(), }) return @@ -329,7 +329,7 @@ func (api *API) putUserProfile(rw http.ResponseWriter, r *http.Request) { organizationIDs, err := userOrganizationIDs(r.Context(), api, user) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's organizations user", + Message: "Internal error fetching user's organizations", Internal: err.Error(), }) return @@ -371,7 +371,7 @@ func (api *API) putUserStatus(status database.UserStatus) func(rw http.ResponseW organizations, err := userOrganizationIDs(r.Context(), api, user) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's organizations", + Message: "Internal error fetching user's organizations", Internal: err.Error(), }) return @@ -417,7 +417,7 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { ok, err := userpassword.Compare(string(user.HashedPassword), params.OldPassword) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error with passwords", + Message: "Internal error with passwords", Internal: err.Error(), }) return @@ -439,7 +439,7 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { hashedPassword, err := userpassword.Hash(params.Password) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error hashing new password", + Message: "Internal error hashing new password", Internal: err.Error(), }) return @@ -450,7 +450,7 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error updating user's password", + Message: "Internal error updating user's password", Internal: err.Error(), }) return @@ -475,7 +475,7 @@ func (api *API) userRoles(rw http.ResponseWriter, r *http.Request) { memberships, err := api.Database.GetOrganizationMembershipsByUserID(r.Context(), user.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's organization memberships", + Message: "Internal error fetching user's organization memberships", Internal: err.Error(), }) return @@ -542,7 +542,7 @@ func (api *API) putUserRoles(rw http.ResponseWriter, r *http.Request) { organizationIDs, err := userOrganizationIDs(r.Context(), api, user) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's organizations", + Message: "Internal error fetching user's organizations", Internal: err.Error(), }) return From 6b08a08b30720014d773f9f007f3100b64469768 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 09:36:47 -0500 Subject: [PATCH 05/21] Add internal error to the cli --- codersdk/client.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/codersdk/client.go b/codersdk/client.go index 0167bc43db96f..0a0b9d1b6f93a 100644 --- a/codersdk/client.go +++ b/codersdk/client.go @@ -202,6 +202,9 @@ func (e *Error) Error() string { if e.Helper != "" { _, _ = fmt.Fprintf(&builder, ": %s", e.Helper) } + if e.Internal != "" { + _, _ = fmt.Fprintf(&builder, "\n\tError: %s", e.Internal) + } for _, err := range e.Errors { _, _ = fmt.Fprintf(&builder, "\n\t%s: %s", err.Field, err.Detail) } From deb5cf1ad6e8763817b873788f33922be73674d4 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 09:40:43 -0500 Subject: [PATCH 06/21] Remove empty switch case --- coderd/parameters.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/coderd/parameters.go b/coderd/parameters.go index b1a56d5ba7581..91b5a0280baf2 100644 --- a/coderd/parameters.go +++ b/coderd/parameters.go @@ -226,12 +226,6 @@ func (api *API) parameterRBACResource(rw http.ResponseWriter, r *http.Request, s // can add user scoped params. resource = rbac.ResourceUserData.WithID(user.ID.String()).WithOwner(user.ID.String()) } - case database.ParameterScopeImportJob: - // This scope does not make sense from this api. - // ImportJob params are created with the job, and the job id cannot - // be predicted. - // Just fallthrough to the unsupported error - fallthrough default: err = xerrors.Errorf("Parameter scope %q unsupported", scope) } From 5e34b5fc531ed7de9e3f579ed5dc6ba539eb1417 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 10:08:20 -0500 Subject: [PATCH 07/21] Update coderd/gitsshkey.go Co-authored-by: Presley Pizzo <1290996+presleyp@users.noreply.github.com> --- coderd/gitsshkey.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/gitsshkey.go b/coderd/gitsshkey.go index 6b7c986069373..ec7af3a2866e3 100644 --- a/coderd/gitsshkey.go +++ b/coderd/gitsshkey.go @@ -21,7 +21,7 @@ func (api *API) regenerateGitSSHKey(rw http.ResponseWriter, r *http.Request) { privateKey, publicKey, err := gitsshkey.Generate(api.SSHKeygenAlgorithm) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error generating a new ssh keypair", + Message: "Internal error generating a new SSH keypair", Internal: err.Error(), }) return From f355dff3c079c83f7d2afc2aaa6e00b56ed89ab8 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 10:08:27 -0500 Subject: [PATCH 08/21] Update coderd/gitsshkey.go Co-authored-by: Presley Pizzo <1290996+presleyp@users.noreply.github.com> --- coderd/gitsshkey.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/gitsshkey.go b/coderd/gitsshkey.go index ec7af3a2866e3..186f38cbe55f9 100644 --- a/coderd/gitsshkey.go +++ b/coderd/gitsshkey.go @@ -35,7 +35,7 @@ func (api *API) regenerateGitSSHKey(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error updating user's git ssh key", + Message: "Internal error updating user's git SSH key", Internal: err.Error(), }) return From 6566e83fff3a0f1f6c131e71d485d38327df97f8 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 10:08:34 -0500 Subject: [PATCH 09/21] Update coderd/gitsshkey.go Co-authored-by: Presley Pizzo <1290996+presleyp@users.noreply.github.com> --- coderd/gitsshkey.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/gitsshkey.go b/coderd/gitsshkey.go index 186f38cbe55f9..889b5dcf45452 100644 --- a/coderd/gitsshkey.go +++ b/coderd/gitsshkey.go @@ -69,7 +69,7 @@ func (api *API) gitSSHKey(rw http.ResponseWriter, r *http.Request) { gitSSHKey, err := api.Database.GetGitSSHKey(r.Context(), user.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's ssh key", + Message: "Internal error fetching user's SSH key", Internal: err.Error(), }) return From fed7b7fc2741bfa5914e3b60fe702fc7fee9fac6 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 10:08:40 -0500 Subject: [PATCH 10/21] Update coderd/gitsshkey.go Co-authored-by: Presley Pizzo <1290996+presleyp@users.noreply.github.com> --- coderd/gitsshkey.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/gitsshkey.go b/coderd/gitsshkey.go index 889b5dcf45452..74207dfe6b490 100644 --- a/coderd/gitsshkey.go +++ b/coderd/gitsshkey.go @@ -116,7 +116,7 @@ func (api *API) agentGitSSHKey(rw http.ResponseWriter, r *http.Request) { gitSSHKey, err := api.Database.GetGitSSHKey(r.Context(), workspace.OwnerID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching git ssh key", + Message: "Internal error fetching git SSH key", Internal: err.Error(), }) return From 5c4ec9280a7339e6970e44991993b33db321f7ae Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 10:08:48 -0500 Subject: [PATCH 11/21] Update coderd/gitsshkey.go Co-authored-by: Presley Pizzo <1290996+presleyp@users.noreply.github.com> --- coderd/gitsshkey.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/gitsshkey.go b/coderd/gitsshkey.go index 74207dfe6b490..1a4f7e22f7a18 100644 --- a/coderd/gitsshkey.go +++ b/coderd/gitsshkey.go @@ -44,7 +44,7 @@ func (api *API) regenerateGitSSHKey(rw http.ResponseWriter, r *http.Request) { newKey, err := api.Database.GetGitSSHKey(r.Context(), user.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's git ssh key", + Message: "Internal error fetching user's git SSH key", Internal: err.Error(), }) return From e373a064a7fd86c74e777aa7270b12c8b2930f23 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 10:08:53 -0500 Subject: [PATCH 12/21] Update coderd/httpapi/httpapi.go Co-authored-by: Presley Pizzo <1290996+presleyp@users.noreply.github.com> --- coderd/httpapi/httpapi.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/httpapi/httpapi.go b/coderd/httpapi/httpapi.go index ed4820dbe0519..403b5b9425da6 100644 --- a/coderd/httpapi/httpapi.go +++ b/coderd/httpapi/httpapi.go @@ -104,7 +104,7 @@ func Read(rw http.ResponseWriter, r *http.Request, value interface{}) bool { err := json.NewDecoder(r.Body).Decode(value) if err != nil { Write(rw, http.StatusBadRequest, Response{ - Message: "Request body must be valid json", + Message: "Request body must be valid JSON", Internal: err.Error(), }) return false From 73ffa22a956ee77d4d730b090b30a37050d9ab4e Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 15:49:02 -0500 Subject: [PATCH 13/21] Rename "Internal" -> "Detail" --- coderd/csp.go | 4 +- coderd/files.go | 12 +-- coderd/httpapi/httpapi.go | 8 +- coderd/httpmw/apikey.go | 12 +-- coderd/httpmw/httpmw.go | 6 +- coderd/httpmw/oauth2.go | 8 +- coderd/httpmw/organizationparam.go | 8 +- coderd/httpmw/templateparam.go | 4 +- coderd/httpmw/templateversionparam.go | 4 +- coderd/httpmw/userparam.go | 4 +- coderd/httpmw/workspaceagent.go | 4 +- coderd/httpmw/workspaceagentparam.go | 20 ++-- coderd/httpmw/workspacebuildparam.go | 4 +- coderd/httpmw/workspaceparam.go | 4 +- coderd/httpmw/workspaceresourceparam.go | 12 +-- coderd/organizations.go | 8 +- coderd/pagination.go | 12 +-- coderd/parameters.go | 28 +++--- coderd/provisionerdaemons.go | 4 +- coderd/provisionerjobs.go | 32 +++--- coderd/templates.go | 44 ++++----- coderd/templateversions.go | 104 ++++++++++---------- coderd/userauth.go | 20 ++-- coderd/users.go | 100 +++++++++---------- coderd/workspaceagents.go | 60 ++++++------ coderd/workspacebuilds.go | 64 ++++++------ coderd/workspaceresourceauth.go | 40 ++++---- coderd/workspaceresources.go | 12 +-- coderd/workspaces.go | 124 ++++++++++++------------ codersdk/client.go | 4 +- 30 files changed, 385 insertions(+), 385 deletions(-) diff --git a/coderd/csp.go b/coderd/csp.go index c9f2c26026f83..680c54dd4cf97 100644 --- a/coderd/csp.go +++ b/coderd/csp.go @@ -23,8 +23,8 @@ func (api *API) logReportCSPViolations(rw http.ResponseWriter, r *http.Request) if err != nil { api.Logger.Warn(ctx, "csp violation", slog.Error(err)) httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Failed to read body, invalid json", - Internal: err.Error(), + Message: "Failed to read body, invalid json", + Detail: err.Error(), }) return } diff --git a/coderd/files.go b/coderd/files.go index 121605ebf10c6..c7aac87c913e6 100644 --- a/coderd/files.go +++ b/coderd/files.go @@ -41,8 +41,8 @@ func (api *API) postFile(rw http.ResponseWriter, r *http.Request) { data, err := io.ReadAll(r.Body) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Failed to read file from request", - Internal: err.Error(), + Message: "Failed to read file from request", + Detail: err.Error(), }) return } @@ -65,8 +65,8 @@ func (api *API) postFile(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error saving file", - Internal: err.Error(), + Message: "Detail error saving file", + Detail: err.Error(), }) return } @@ -91,8 +91,8 @@ func (api *API) fileByHash(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Internal error fetching file"), - Internal: err.Error(), + Message: fmt.Sprintf("Detail error fetching file"), + Detail: err.Error(), }) return } diff --git a/coderd/httpapi/httpapi.go b/coderd/httpapi/httpapi.go index 403b5b9425da6..54353c16f0b1c 100644 --- a/coderd/httpapi/httpapi.go +++ b/coderd/httpapi/httpapi.go @@ -55,12 +55,12 @@ type Response struct { // Message is for general user-friendly error messages. This message will // be shown at the top/bottom of a form, or in a toast on the UI. Message string `json:"message"` - // Internal has the technical error information (err.Error()). These details + // Detail has the technical error information (err.Error()). These details // might come from external packages and might not be user friendly. // Do not populate this error field with any sensitive information or // any errors that may be a security implication. These details are still // available to more technical users. - Internal string `json:"internal"` + Detail string `json:"detail"` // Errors are form field-specific friendly error messages. They will be // shown on a form field in the UI. These can also be used to add additional // context if there is a set of errors in the primary 'Message'. @@ -127,8 +127,8 @@ func Read(rw http.ResponseWriter, r *http.Request, value interface{}) bool { } if err != nil { Write(rw, http.StatusInternalServerError, Response{ - Message: "Internal error validating request body payload", - Internal: err.Error(), + Message: "Internal error validating request body payload", + Detail: err.Error(), }) return false } diff --git a/coderd/httpmw/apikey.go b/coderd/httpmw/apikey.go index 94f38e69acf55..291546ef525a3 100644 --- a/coderd/httpmw/apikey.go +++ b/coderd/httpmw/apikey.go @@ -101,8 +101,8 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h return } httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching api key by id", - Internal: err.Error(), + Message: "Internal error fetching api key by id", + Detail: err.Error(), }) return } @@ -140,8 +140,8 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h }).Token() if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "Could not refresh expired oauth token", - Internal: err.Error(), + Message: "Could not refresh expired oauth token", + Detail: err.Error(), }) return } @@ -196,8 +196,8 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h roles, err := db.GetAuthorizationUserRoles(r.Context(), key.UserID) if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "Internal error fetching user's roles", - Internal: err.Error(), + Message: "Internal error fetching user's roles", + Detail: err.Error(), }) return } diff --git a/coderd/httpmw/httpmw.go b/coderd/httpmw/httpmw.go index c8d5e7690a9d8..a39e5cbaa06ce 100644 --- a/coderd/httpmw/httpmw.go +++ b/coderd/httpmw/httpmw.go @@ -17,7 +17,7 @@ func parseUUID(rw http.ResponseWriter, r *http.Request, param string) (uuid.UUID httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: "Missing uuid in url", // Url params mean nothing to a user - Internal: fmt.Sprintf("%q url param missing", param), + Detail: fmt.Sprintf("%q url param missing", param), }) return uuid.UUID{}, false } @@ -25,8 +25,8 @@ func parseUUID(rw http.ResponseWriter, r *http.Request, param string) (uuid.UUID parsed, err := uuid.Parse(rawID) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("Invalid uuid %q", param), - Internal: err.Error(), + Message: fmt.Sprintf("Invalid uuid %q", param), + Detail: err.Error(), }) return uuid.UUID{}, false } diff --git a/coderd/httpmw/oauth2.go b/coderd/httpmw/oauth2.go index be5d8880b59c6..e54a78ed1fe71 100644 --- a/coderd/httpmw/oauth2.go +++ b/coderd/httpmw/oauth2.go @@ -63,8 +63,8 @@ func ExtractOAuth2(config OAuth2Config) func(http.Handler) http.Handler { state, err := cryptorand.String(32) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error generating state string", - Internal: err.Error(), + Message: "Internal error generating state string", + Detail: err.Error(), }) return } @@ -120,8 +120,8 @@ func ExtractOAuth2(config OAuth2Config) func(http.Handler) http.Handler { oauthToken, err := config.Exchange(r.Context(), code) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error exchanging oauth code", - Internal: err.Error(), + Message: "Internal error exchanging oauth code", + Detail: err.Error(), }) return } diff --git a/coderd/httpmw/organizationparam.go b/coderd/httpmw/organizationparam.go index 5cd8519255e2a..0f774302cd5aa 100644 --- a/coderd/httpmw/organizationparam.go +++ b/coderd/httpmw/organizationparam.go @@ -52,8 +52,8 @@ func ExtractOrganizationParam(db database.Store) func(http.Handler) http.Handler } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching organization", - Internal: err.Error(), + Message: "Internal error fetching organization", + Detail: err.Error(), }) return } @@ -83,8 +83,8 @@ func ExtractOrganizationMemberParam(db database.Store) func(http.Handler) http.H } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching organization member", - Internal: err.Error(), + Message: "Internal error fetching organization member", + Detail: err.Error(), }) return } diff --git a/coderd/httpmw/templateparam.go b/coderd/httpmw/templateparam.go index 6a434d3459155..148d64a64c791 100644 --- a/coderd/httpmw/templateparam.go +++ b/coderd/httpmw/templateparam.go @@ -40,8 +40,8 @@ func ExtractTemplateParam(db database.Store) func(http.Handler) http.Handler { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template", - Internal: err.Error(), + Message: "Internal error fetching template", + Detail: err.Error(), }) return } diff --git a/coderd/httpmw/templateversionparam.go b/coderd/httpmw/templateversionparam.go index bf220811a9384..61774db968db1 100644 --- a/coderd/httpmw/templateversionparam.go +++ b/coderd/httpmw/templateversionparam.go @@ -41,8 +41,8 @@ func ExtractTemplateVersionParam(db database.Store) func(http.Handler) http.Hand } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template version", - Internal: err.Error(), + Message: "Internal error fetching template version", + Detail: err.Error(), }) return } diff --git a/coderd/httpmw/userparam.go b/coderd/httpmw/userparam.go index 688ad084462f6..55d1ae9789cf3 100644 --- a/coderd/httpmw/userparam.go +++ b/coderd/httpmw/userparam.go @@ -49,8 +49,8 @@ func ExtractUserParam(db database.Store) func(http.Handler) http.Handler { user, err = db.GetUserByID(r.Context(), APIKey(r).UserID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user", - Internal: err.Error(), + Message: "Internal error fetching user", + Detail: err.Error(), }) return } diff --git a/coderd/httpmw/workspaceagent.go b/coderd/httpmw/workspaceagent.go index a8b944a84b9f6..85fc29aff159d 100644 --- a/coderd/httpmw/workspaceagent.go +++ b/coderd/httpmw/workspaceagent.go @@ -53,8 +53,8 @@ func ExtractWorkspaceAgent(db database.Store) func(http.Handler) http.Handler { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace agent", - Internal: err.Error(), + Message: "Internal error fetching workspace agent", + Detail: err.Error(), }) return } diff --git a/coderd/httpmw/workspaceagentparam.go b/coderd/httpmw/workspaceagentparam.go index 79c67cdfd41c0..a1e5503980087 100644 --- a/coderd/httpmw/workspaceagentparam.go +++ b/coderd/httpmw/workspaceagentparam.go @@ -38,16 +38,16 @@ func ExtractWorkspaceAgentParam(db database.Store) func(http.Handler) http.Handl } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace agent", - Internal: err.Error(), + Message: "Internal error fetching workspace agent", + Detail: err.Error(), }) return } resource, err := db.GetWorkspaceResourceByID(r.Context(), agent.ResourceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace resource", - Internal: err.Error(), + Message: "Internal error fetching workspace resource", + Detail: err.Error(), }) return } @@ -55,8 +55,8 @@ func ExtractWorkspaceAgentParam(db database.Store) func(http.Handler) http.Handl job, err := db.GetProvisionerJobByID(r.Context(), resource.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Internal error fetching provisioner job", + Detail: err.Error(), }) return } @@ -69,16 +69,16 @@ func ExtractWorkspaceAgentParam(db database.Store) func(http.Handler) http.Handl build, err := db.GetWorkspaceBuildByJobID(r.Context(), job.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace build", - Internal: err.Error(), + Message: "Internal error fetching workspace build", + Detail: err.Error(), }) return } workspace, err := db.GetWorkspaceByID(r.Context(), build.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace", - Internal: err.Error(), + Message: "Internal error fetching workspace", + Detail: err.Error(), }) return } diff --git a/coderd/httpmw/workspacebuildparam.go b/coderd/httpmw/workspacebuildparam.go index 3f00fe8c0cd15..84d3967336d73 100644 --- a/coderd/httpmw/workspacebuildparam.go +++ b/coderd/httpmw/workspacebuildparam.go @@ -41,8 +41,8 @@ func ExtractWorkspaceBuildParam(db database.Store) func(http.Handler) http.Handl } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace build", - Internal: err.Error(), + Message: "Internal error fetching workspace build", + Detail: err.Error(), }) return } diff --git a/coderd/httpmw/workspaceparam.go b/coderd/httpmw/workspaceparam.go index 2cd2084e44f2d..b804657021cd2 100644 --- a/coderd/httpmw/workspaceparam.go +++ b/coderd/httpmw/workspaceparam.go @@ -39,8 +39,8 @@ func ExtractWorkspaceParam(db database.Store) func(http.Handler) http.Handler { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace", - Internal: err.Error(), + Message: "Internal error fetching workspace", + Detail: err.Error(), }) return } diff --git a/coderd/httpmw/workspaceresourceparam.go b/coderd/httpmw/workspaceresourceparam.go index 6e6489160fa21..841801b6aafa1 100644 --- a/coderd/httpmw/workspaceresourceparam.go +++ b/coderd/httpmw/workspaceresourceparam.go @@ -40,8 +40,8 @@ func ExtractWorkspaceResourceParam(db database.Store) func(http.Handler) http.Ha } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner resource", - Internal: err.Error(), + Message: "Internal error fetching provisioner resource", + Detail: err.Error(), }) return } @@ -49,8 +49,8 @@ func ExtractWorkspaceResourceParam(db database.Store) func(http.Handler) http.Ha job, err := db.GetProvisionerJobByID(r.Context(), resource.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error provisioner job", - Internal: err.Error(), + Message: "Internal error provisioner job", + Detail: err.Error(), }) return } @@ -63,8 +63,8 @@ func ExtractWorkspaceResourceParam(db database.Store) func(http.Handler) http.Ha build, err := db.GetWorkspaceBuildByJobID(r.Context(), job.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error workspace build", - Internal: err.Error(), + Message: "Internal error workspace build", + Detail: err.Error(), }) return } diff --git a/coderd/organizations.go b/coderd/organizations.go index cb726c15fbfaf..b821351f1de0c 100644 --- a/coderd/organizations.go +++ b/coderd/organizations.go @@ -51,8 +51,8 @@ func (api *API) postOrganizations(rw http.ResponseWriter, r *http.Request) { } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Internal error fetching organization %q", req.Name), - Internal: err.Error(), + Message: fmt.Sprintf("Detail error fetching organization %q", req.Name), + Detail: err.Error(), }) return } @@ -84,8 +84,8 @@ func (api *API) postOrganizations(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error inserting organization member", - Internal: err.Error(), + Message: "Detail error inserting organization member", + Detail: err.Error(), }) return } diff --git a/coderd/pagination.go b/coderd/pagination.go index 037d08c729e72..bd90469a0e519 100644 --- a/coderd/pagination.go +++ b/coderd/pagination.go @@ -24,8 +24,8 @@ func parsePagination(w http.ResponseWriter, r *http.Request) (p codersdk.Paginat afterID, err = uuid.Parse(r.URL.Query().Get("after_id")) if err != nil { httpapi.Write(w, http.StatusBadRequest, httpapi.Response{ - Message: "Query param 'after_id' must be a valid uuid", - Internal: err.Error(), + Message: "Query param 'after_id' must be a valid uuid", + Detail: err.Error(), Errors: []httpapi.Error{ {Field: "after_id", Detail: err.Error()}, }, @@ -37,8 +37,8 @@ func parsePagination(w http.ResponseWriter, r *http.Request) (p codersdk.Paginat limit, err = strconv.Atoi(s) if err != nil { httpapi.Write(w, http.StatusBadRequest, httpapi.Response{ - Message: "Query param 'limit' must be a valid integer", - Internal: err.Error(), + Message: "Query param 'limit' must be a valid integer", + Detail: err.Error(), Errors: []httpapi.Error{ {Field: "limit", Detail: err.Error()}, }, @@ -50,8 +50,8 @@ func parsePagination(w http.ResponseWriter, r *http.Request) (p codersdk.Paginat offset, err = strconv.Atoi(s) if err != nil { httpapi.Write(w, http.StatusBadRequest, httpapi.Response{ - Message: "Query param 'offset' must be a valid integer", - Internal: err.Error(), + Message: "Query param 'offset' must be a valid integer", + Detail: err.Error(), Errors: []httpapi.Error{ {Field: "offset", Detail: err.Error()}, }, diff --git a/coderd/parameters.go b/coderd/parameters.go index 91b5a0280baf2..3bd3dc37a5b95 100644 --- a/coderd/parameters.go +++ b/coderd/parameters.go @@ -47,8 +47,8 @@ func (api *API) postParameter(rw http.ResponseWriter, r *http.Request) { } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching parameter", - Internal: err.Error(), + Message: "Detail error fetching parameter", + Detail: err.Error(), }) return } @@ -66,8 +66,8 @@ func (api *API) postParameter(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error inserting parameter", - Internal: err.Error(), + Message: "Detail error inserting parameter", + Detail: err.Error(), }) return } @@ -98,8 +98,8 @@ func (api *API) parameters(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching parameter scope values", - Internal: err.Error(), + Message: "Detail error fetching parameter scope values", + Detail: err.Error(), }) return } @@ -133,23 +133,23 @@ func (api *API) deleteParameter(rw http.ResponseWriter, r *http.Request) { }) if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ - Message: fmt.Sprintf("No parameter found at the provided scope with name %q", name), - Internal: err.Error(), + Message: fmt.Sprintf("No parameter found at the provided scope with name %q", name), + Detail: err.Error(), }) return } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Internal error fetching parameter"), - Internal: err.Error(), + Message: fmt.Sprintf("Detail error fetching parameter"), + Detail: err.Error(), }) return } err = api.Database.DeleteParameterValueByID(r.Context(), parameterValue.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Internal error deleting parameter"), - Internal: err.Error(), + Message: fmt.Sprintf("Detail error deleting parameter"), + Detail: err.Error(), }) return } @@ -269,8 +269,8 @@ func readScopeAndID(rw http.ResponseWriter, r *http.Request) (database.Parameter uid, err := uuid.Parse(id) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("Invalid uuid %q", id), - Internal: err.Error(), + Message: fmt.Sprintf("Invalid uuid %q", id), + Detail: err.Error(), Errors: []httpapi.Error{ {Field: "id", Detail: "Invalid uuid"}, }, diff --git a/coderd/provisionerdaemons.go b/coderd/provisionerdaemons.go index 86365f26b4259..9b4eba1323b79 100644 --- a/coderd/provisionerdaemons.go +++ b/coderd/provisionerdaemons.go @@ -38,8 +38,8 @@ func (api *API) provisionerDaemons(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner daemons", - Internal: err.Error(), + Message: "Detail error fetching provisioner daemons", + Detail: err.Error(), }) return } diff --git a/coderd/provisionerjobs.go b/coderd/provisionerjobs.go index d0fbee86a9010..ed97fef81310d 100644 --- a/coderd/provisionerjobs.go +++ b/coderd/provisionerjobs.go @@ -43,8 +43,8 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job afterMS, err := strconv.ParseInt(afterRaw, 10, 64) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Query param \"after\" must be an integer", - Internal: err.Error(), + Message: "Query param \"after\" must be an integer", + Detail: err.Error(), Errors: []httpapi.Error{ {Field: "after", Detail: "Must be an integer"}, }, @@ -63,8 +63,8 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job beforeMS, err := strconv.ParseInt(beforeRaw, 10, 64) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Query param \"before\" must be an integer", - Internal: err.Error(), + Message: "Query param \"before\" must be an integer", + Detail: err.Error(), Errors: []httpapi.Error{ {Field: "before", Detail: "Must be an integer"}, }, @@ -87,8 +87,8 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner logs", - Internal: err.Error(), + Message: "Detail error fetching provisioner logs", + Detail: err.Error(), }) return } @@ -121,8 +121,8 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error watching provisioner logs", - Internal: err.Error(), + Message: "Detail error watching provisioner logs", + Detail: err.Error(), }) return } @@ -138,8 +138,8 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner logs", - Internal: err.Error(), + Message: "Detail error fetching provisioner logs", + Detail: err.Error(), }) return } @@ -202,8 +202,8 @@ func (api *API) provisionerJobResources(rw http.ResponseWriter, r *http.Request, } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching job resources", - Internal: err.Error(), + Message: "Detail error fetching job resources", + Detail: err.Error(), }) return } @@ -217,8 +217,8 @@ func (api *API) provisionerJobResources(rw http.ResponseWriter, r *http.Request, } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace agent", - Internal: err.Error(), + Message: "Detail error fetching workspace agent", + Detail: err.Error(), }) return } @@ -233,8 +233,8 @@ func (api *API) provisionerJobResources(rw http.ResponseWriter, r *http.Request, apiAgent, err := convertWorkspaceAgent(agent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error reading job agent", - Internal: err.Error(), + Message: "Detail error reading job agent", + Detail: err.Error(), }) return } diff --git a/coderd/templates.go b/coderd/templates.go index 4f8c9a8f300f8..6414911303413 100644 --- a/coderd/templates.go +++ b/coderd/templates.go @@ -27,8 +27,8 @@ func (api *API) template(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace count", - Internal: err.Error(), + Message: "Detail error fetching workspace count", + Detail: err.Error(), }) return } @@ -59,8 +59,8 @@ func (api *API) deleteTemplate(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspaces by template id", - Internal: err.Error(), + Message: "Detail error fetching workspaces by template id", + Detail: err.Error(), }) return } @@ -76,8 +76,8 @@ func (api *API) deleteTemplate(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error deleting template", - Internal: err.Error(), + Message: "Detail error deleting template", + Detail: err.Error(), }) return } @@ -113,8 +113,8 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template by name", - Internal: err.Error(), + Message: "Detail error fetching template by name", + Detail: err.Error(), }) return } @@ -130,16 +130,16 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template version", - Internal: err.Error(), + Message: "Detail error fetching template version", + Detail: err.Error(), }) return } importJob, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } @@ -194,8 +194,8 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error inserting template", - Internal: err.Error(), + Message: "Detail error inserting template", + Detail: err.Error(), }) return } @@ -213,8 +213,8 @@ func (api *API) templatesByOrganization(rw http.ResponseWriter, r *http.Request) } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching templates in organization", - Internal: err.Error(), + Message: "Detail error fetching templates in organization", + Detail: err.Error(), }) return } @@ -233,8 +233,8 @@ func (api *API) templatesByOrganization(rw http.ResponseWriter, r *http.Request) } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace counts", - Internal: err.Error(), + Message: "Detail error fetching workspace counts", + Detail: err.Error(), }) return } @@ -258,8 +258,8 @@ func (api *API) templateByOrganizationAndName(rw http.ResponseWriter, r *http.Re } httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template", - Internal: err.Error(), + Message: "Detail error fetching template", + Detail: err.Error(), }) return } @@ -274,8 +274,8 @@ func (api *API) templateByOrganizationAndName(rw http.ResponseWriter, r *http.Re } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace counts", - Internal: err.Error(), + Message: "Detail error fetching workspace counts", + Detail: err.Error(), }) return } diff --git a/coderd/templateversions.go b/coderd/templateversions.go index b878a0c6fb9f6..dcab033963d8e 100644 --- a/coderd/templateversions.go +++ b/coderd/templateversions.go @@ -29,8 +29,8 @@ func (api *API) templateVersion(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } @@ -47,8 +47,8 @@ func (api *API) patchCancelTemplateVersion(rw http.ResponseWriter, r *http.Reque job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } @@ -73,8 +73,8 @@ func (api *API) patchCancelTemplateVersion(rw http.ResponseWriter, r *http.Reque }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error updating provisioner job", - Internal: err.Error(), + Message: "Detail error updating provisioner job", + Detail: err.Error(), }) return } @@ -92,8 +92,8 @@ func (api *API) templateVersionSchema(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } @@ -109,8 +109,8 @@ func (api *API) templateVersionSchema(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error listing parameter schemas", - Internal: err.Error(), + Message: "Detail error listing parameter schemas", + Detail: err.Error(), }) return } @@ -119,8 +119,8 @@ func (api *API) templateVersionSchema(rw http.ResponseWriter, r *http.Request) { apiSchema, err := convertParameterSchema(schema) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Internal error converting schema %s", schema.Name), - Internal: err.Error(), + Message: fmt.Sprintf("Detail error converting schema %s", schema.Name), + Detail: err.Error(), }) return } @@ -139,8 +139,8 @@ func (api *API) templateVersionParameters(rw http.ResponseWriter, r *http.Reques job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } @@ -160,8 +160,8 @@ func (api *API) templateVersionParameters(rw http.ResponseWriter, r *http.Reques }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error computing values", - Internal: err.Error(), + Message: "Detail error computing values", + Detail: err.Error(), }) return } @@ -193,8 +193,8 @@ func (api *API) postTemplateVersionDryRun(rw http.ResponseWriter, r *http.Reques job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error updating provisioner job", - Internal: err.Error(), + Message: "Detail error updating provisioner job", + Detail: err.Error(), }) return } @@ -228,8 +228,8 @@ func (api *API) postTemplateVersionDryRun(rw http.ResponseWriter, r *http.Reques }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error unmarshalling provisioner job", - Internal: err.Error(), + Message: "Detail error unmarshalling provisioner job", + Detail: err.Error(), }) return } @@ -250,8 +250,8 @@ func (api *API) postTemplateVersionDryRun(rw http.ResponseWriter, r *http.Reques }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error inserting provisioner job", - Internal: err.Error(), + Message: "Detail error inserting provisioner job", + Detail: err.Error(), }) return } @@ -320,8 +320,8 @@ func (api *API) patchTemplateVersionDryRunCancel(rw http.ResponseWriter, r *http }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error updating provisioner job", - Internal: err.Error(), + Message: "Detail error updating provisioner job", + Detail: err.Error(), }) return } @@ -343,8 +343,8 @@ func (api *API) fetchTemplateVersionDryRunJob(rw http.ResponseWriter, r *http.Re jobUUID, err := uuid.Parse(jobID) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("Job ID %q must be a valid UUID", jobID), - Internal: err.Error(), + Message: fmt.Sprintf("Job ID %q must be a valid UUID", jobID), + Detail: err.Error(), }) return database.ProvisionerJob{}, false } @@ -356,8 +356,8 @@ func (api *API) fetchTemplateVersionDryRunJob(rw http.ResponseWriter, r *http.Re } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return database.ProvisionerJob{}, false } @@ -376,8 +376,8 @@ func (api *API) fetchTemplateVersionDryRunJob(rw http.ResponseWriter, r *http.Re err = json.Unmarshal(job.Input, &input) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error unmarshaling job metadata", - Internal: err.Error(), + Message: "Detail error unmarshaling job metadata", + Detail: err.Error(), }) return database.ProvisionerJob{}, false } @@ -414,8 +414,8 @@ func (api *API) templateVersionsByTemplate(rw http.ResponseWriter, r *http.Reque return err } else if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template version at after_id", - Internal: err.Error(), + Message: "Detail error fetching template version at after_id", + Detail: err.Error(), }) return err } @@ -433,8 +433,8 @@ func (api *API) templateVersionsByTemplate(rw http.ResponseWriter, r *http.Reque } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template versions", - Internal: err.Error(), + Message: "Detail error fetching template versions", + Detail: err.Error(), }) return err } @@ -446,8 +446,8 @@ func (api *API) templateVersionsByTemplate(rw http.ResponseWriter, r *http.Reque jobs, err := store.GetProvisionerJobsByIDs(r.Context(), jobIDs) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return err } @@ -498,16 +498,16 @@ func (api *API) templateVersionByName(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template version", - Internal: err.Error(), + Message: "Detail error fetching template version", + Detail: err.Error(), }) return } job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } @@ -534,8 +534,8 @@ func (api *API) patchActiveTemplateVersion(rw http.ResponseWriter, r *http.Reque } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template version", - Internal: err.Error(), + Message: "Detail error fetching template version", + Detail: err.Error(), }) return } @@ -551,8 +551,8 @@ func (api *API) patchActiveTemplateVersion(rw http.ResponseWriter, r *http.Reque }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error updating active template version", - Internal: err.Error(), + Message: "Detail error updating active template version", + Detail: err.Error(), }) return } @@ -580,8 +580,8 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template", - Internal: err.Error(), + Message: "Detail error fetching template", + Detail: err.Error(), }) return } @@ -596,8 +596,8 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching file", - Internal: err.Error(), + Message: "Detail error fetching file", + Detail: err.Error(), }) return } @@ -695,8 +695,8 @@ func (api *API) templateVersionResources(rw http.ResponseWriter, r *http.Request job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } @@ -716,8 +716,8 @@ func (api *API) templateVersionLogs(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } diff --git a/coderd/userauth.go b/coderd/userauth.go index 89fead21bdcc2..46d9fedab9460 100644 --- a/coderd/userauth.go +++ b/coderd/userauth.go @@ -42,8 +42,8 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { memberships, err := api.GithubOAuth2Config.ListOrganizationMemberships(r.Context(), oauthClient) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching authenticated github user organizations", - Internal: err.Error(), + Message: "Detail error fetching authenticated github user organizations", + Detail: err.Error(), }) return } @@ -67,8 +67,8 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { emails, err := api.GithubOAuth2Config.ListEmails(r.Context(), oauthClient) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching personal github user", - Internal: err.Error(), + Message: "Detail error fetching personal github user", + Detail: err.Error(), }) return } @@ -88,8 +88,8 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Internal error fetching user by email %q", *email.Email), - Internal: err.Error(), + Message: fmt.Sprintf("Detail error fetching user by email %q", *email.Email), + Detail: err.Error(), }) return } @@ -122,8 +122,8 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { ghUser, err := api.GithubOAuth2Config.AuthenticatedUser(r.Context(), oauthClient) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching authenticated github user", - Internal: err.Error(), + Message: "Detail error fetching authenticated github user", + Detail: err.Error(), }) return } @@ -148,8 +148,8 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error creating user", - Internal: err.Error(), + Message: "Detail error creating user", + Detail: err.Error(), }) return } diff --git a/coderd/users.go b/coderd/users.go index ee01dcea72bb3..d7a74e8fb739a 100644 --- a/coderd/users.go +++ b/coderd/users.go @@ -30,8 +30,8 @@ func (api *API) firstUser(rw http.ResponseWriter, r *http.Request) { userCount, err := api.Database.GetUserCount(r.Context()) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user count", - Internal: err.Error(), + Message: "Detail error fetching user count", + Detail: err.Error(), }) return } @@ -59,8 +59,8 @@ func (api *API) postFirstUser(rw http.ResponseWriter, r *http.Request) { userCount, err := api.Database.GetUserCount(r.Context()) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user count", - Internal: err.Error(), + Message: "Detail error fetching user count", + Detail: err.Error(), }) return } @@ -80,8 +80,8 @@ func (api *API) postFirstUser(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error creating user", - Internal: err.Error(), + Message: "Detail error creating user", + Detail: err.Error(), }) return } @@ -96,8 +96,8 @@ func (api *API) postFirstUser(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error updating user's roles", - Internal: err.Error(), + Message: "Detail error updating user's roles", + Detail: err.Error(), }) return } @@ -157,8 +157,8 @@ func (api *API) users(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching users", - Internal: err.Error(), + Message: "Detail error fetching users", + Detail: err.Error(), }) return } @@ -173,8 +173,8 @@ func (api *API) users(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's organizations", - Internal: err.Error(), + Message: "Detail error fetching user's organizations", + Detail: err.Error(), }) return } @@ -219,8 +219,8 @@ func (api *API) postUser(rw http.ResponseWriter, r *http.Request) { } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user", - Internal: err.Error(), + Message: "Detail error fetching user", + Detail: err.Error(), }) return } @@ -234,8 +234,8 @@ func (api *API) postUser(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching organization", - Internal: err.Error(), + Message: "Detail error fetching organization", + Detail: err.Error(), }) return } @@ -243,8 +243,8 @@ func (api *API) postUser(rw http.ResponseWriter, r *http.Request) { user, _, err := api.createUser(r.Context(), createUser) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error creating user", - Internal: err.Error(), + Message: "Detail error creating user", + Detail: err.Error(), }) return } @@ -264,8 +264,8 @@ func (api *API) userByName(rw http.ResponseWriter, r *http.Request) { if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's organizations", - Internal: err.Error(), + Message: "Detail error fetching user's organizations", + Detail: err.Error(), }) return } @@ -305,8 +305,8 @@ func (api *API) putUserProfile(rw http.ResponseWriter, r *http.Request) { } if !errors.Is(err, sql.ErrNoRows) && isDifferentUser { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user", - Internal: err.Error(), + Message: "Detail error fetching user", + Detail: err.Error(), }) return } @@ -320,8 +320,8 @@ func (api *API) putUserProfile(rw http.ResponseWriter, r *http.Request) { if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error updating user", - Internal: err.Error(), + Message: "Detail error updating user", + Detail: err.Error(), }) return } @@ -329,8 +329,8 @@ func (api *API) putUserProfile(rw http.ResponseWriter, r *http.Request) { organizationIDs, err := userOrganizationIDs(r.Context(), api, user) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's organizations", - Internal: err.Error(), + Message: "Detail error fetching user's organizations", + Detail: err.Error(), }) return } @@ -362,8 +362,8 @@ func (api *API) putUserStatus(status database.UserStatus) func(rw http.ResponseW if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Internal error updating user's status to %q", status), - Internal: err.Error(), + Message: fmt.Sprintf("Detail error updating user's status to %q", status), + Detail: err.Error(), }) return } @@ -371,8 +371,8 @@ func (api *API) putUserStatus(status database.UserStatus) func(rw http.ResponseW organizations, err := userOrganizationIDs(r.Context(), api, user) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's organizations", - Internal: err.Error(), + Message: "Detail error fetching user's organizations", + Detail: err.Error(), }) return } @@ -417,8 +417,8 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { ok, err := userpassword.Compare(string(user.HashedPassword), params.OldPassword) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error with passwords", - Internal: err.Error(), + Message: "Detail error with passwords", + Detail: err.Error(), }) return } @@ -439,8 +439,8 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { hashedPassword, err := userpassword.Hash(params.Password) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error hashing new password", - Internal: err.Error(), + Message: "Detail error hashing new password", + Detail: err.Error(), }) return } @@ -450,8 +450,8 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error updating user's password", - Internal: err.Error(), + Message: "Detail error updating user's password", + Detail: err.Error(), }) return } @@ -475,8 +475,8 @@ func (api *API) userRoles(rw http.ResponseWriter, r *http.Request) { memberships, err := api.Database.GetOrganizationMembershipsByUserID(r.Context(), user.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's organization memberships", - Internal: err.Error(), + Message: "Detail error fetching user's organization memberships", + Detail: err.Error(), }) return } @@ -542,8 +542,8 @@ func (api *API) putUserRoles(rw http.ResponseWriter, r *http.Request) { organizationIDs, err := userOrganizationIDs(r.Context(), api, user) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's organizations", - Internal: err.Error(), + Message: "Detail error fetching user's organizations", + Detail: err.Error(), }) return } @@ -583,8 +583,8 @@ func (api *API) organizationsByUser(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's organizations", - Internal: err.Error(), + Message: "Detail error fetching user's organizations", + Detail: err.Error(), }) return } @@ -636,7 +636,7 @@ func (api *API) postLogin(rw http.ResponseWriter, r *http.Request) { }) if err != nil && !xerrors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error", + Message: "Detail error", }) return } @@ -645,7 +645,7 @@ func (api *API) postLogin(rw http.ResponseWriter, r *http.Request) { equal, err := userpassword.Compare(string(user.HashedPassword), loginWithPassword.Password) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error", + Message: "Detail error", }) } if !equal { @@ -719,8 +719,8 @@ func (api *API) postLogout(rw http.ResponseWriter, r *http.Request) { err := api.Database.DeleteAPIKeyByID(r.Context(), apiKey.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error deleting api key", - Internal: err.Error(), + Message: "Detail error deleting api key", + Detail: err.Error(), }) return } @@ -749,8 +749,8 @@ func (api *API) createAPIKey(rw http.ResponseWriter, r *http.Request, params dat keyID, keySecret, err := generateAPIKeyIDSecret() if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error generating api key", - Internal: err.Error(), + Message: "Detail error generating api key", + Detail: err.Error(), }) return "", false } @@ -782,8 +782,8 @@ func (api *API) createAPIKey(rw http.ResponseWriter, r *http.Request, params dat }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error inserting api key", - Internal: err.Error(), + Message: "Detail error inserting api key", + Detail: err.Error(), }) return "", false } diff --git a/coderd/workspaceagents.go b/coderd/workspaceagents.go index b8400caae034c..9434d554725d0 100644 --- a/coderd/workspaceagents.go +++ b/coderd/workspaceagents.go @@ -34,8 +34,8 @@ func (api *API) workspaceAgent(rw http.ResponseWriter, r *http.Request) { apiAgent, err := convertWorkspaceAgent(workspaceAgent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error reading workspace agent", - Internal: err.Error(), + Message: "Detail error reading workspace agent", + Detail: err.Error(), }) return } @@ -53,8 +53,8 @@ func (api *API) workspaceAgentDial(rw http.ResponseWriter, r *http.Request) { apiAgent, err := convertWorkspaceAgent(workspaceAgent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error reading workspace agent", - Internal: err.Error(), + Message: "Detail error reading workspace agent", + Detail: err.Error(), }) return } @@ -68,8 +68,8 @@ func (api *API) workspaceAgentDial(rw http.ResponseWriter, r *http.Request) { conn, err := websocket.Accept(rw, r, nil) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Failed to accept websocket", - Internal: err.Error(), + Message: "Failed to accept websocket", + Detail: err.Error(), }) return } @@ -100,40 +100,40 @@ func (api *API) workspaceAgentMetadata(rw http.ResponseWriter, r *http.Request) apiAgent, err := convertWorkspaceAgent(workspaceAgent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error reading workspace agent", - Internal: err.Error(), + Message: "Detail error reading workspace agent", + Detail: err.Error(), }) return } resource, err := api.Database.GetWorkspaceResourceByID(r.Context(), workspaceAgent.ResourceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace resources", - Internal: err.Error(), + Message: "Detail error fetching workspace resources", + Detail: err.Error(), }) return } build, err := api.Database.GetWorkspaceBuildByJobID(r.Context(), resource.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace build", - Internal: err.Error(), + Message: "Detail error fetching workspace build", + Detail: err.Error(), }) return } workspace, err := api.Database.GetWorkspaceByID(r.Context(), build.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace", - Internal: err.Error(), + Message: "Detail error fetching workspace", + Detail: err.Error(), }) return } owner, err := api.Database.GetUserByID(r.Context(), workspace.OwnerID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace owner", - Internal: err.Error(), + Message: "Detail error fetching workspace owner", + Detail: err.Error(), }) return } @@ -156,8 +156,8 @@ func (api *API) workspaceAgentListen(rw http.ResponseWriter, r *http.Request) { resource, err := api.Database.GetWorkspaceResourceByID(r.Context(), workspaceAgent.ResourceID) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Failed to accept websocket", - Internal: err.Error(), + Message: "Failed to accept websocket", + Detail: err.Error(), }) return } @@ -312,8 +312,8 @@ func (api *API) workspaceAgentTurn(rw http.ResponseWriter, r *http.Request) { host, port, err := net.SplitHostPort(r.RemoteAddr) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Invalid remote address", - Internal: err.Error(), + Message: "Invalid remote address", + Detail: err.Error(), }) return } @@ -321,8 +321,8 @@ func (api *API) workspaceAgentTurn(rw http.ResponseWriter, r *http.Request) { remoteAddress.Port, err = strconv.Atoi(port) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("Remote address %q has no parsable port, must be an integer.", r.RemoteAddr), - Internal: err.Error(), + Message: fmt.Sprintf("Remote address %q has no parsable port, must be an integer.", r.RemoteAddr), + Detail: err.Error(), }) return } @@ -332,8 +332,8 @@ func (api *API) workspaceAgentTurn(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Failed to accept websocket", - Internal: err.Error(), + Message: "Failed to accept websocket", + Detail: err.Error(), }) return } @@ -361,8 +361,8 @@ func (api *API) workspaceAgentPTY(rw http.ResponseWriter, r *http.Request) { apiAgent, err := convertWorkspaceAgent(workspaceAgent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error reading workspace agent", - Internal: err.Error(), + Message: "Detail error reading workspace agent", + Detail: err.Error(), }) return } @@ -376,8 +376,8 @@ func (api *API) workspaceAgentPTY(rw http.ResponseWriter, r *http.Request) { reconnect, err := uuid.Parse(r.URL.Query().Get("reconnect")) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Query param 'reconnect' must be a valid uuid", - Internal: err.Error(), + Message: "Query param 'reconnect' must be a valid uuid", + Detail: err.Error(), Errors: []httpapi.Error{ {Field: "reconnect", Detail: "invalid uuid"}, }, @@ -398,8 +398,8 @@ func (api *API) workspaceAgentPTY(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Failed to accept websocket", - Internal: err.Error(), + Message: "Failed to accept websocket", + Detail: err.Error(), }) return } diff --git a/coderd/workspacebuilds.go b/coderd/workspacebuilds.go index 4019441e26067..347c1cdfc8454 100644 --- a/coderd/workspacebuilds.go +++ b/coderd/workspacebuilds.go @@ -31,8 +31,8 @@ func (api *API) workspaceBuild(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } @@ -68,8 +68,8 @@ func (api *API) workspaceBuilds(rw http.ResponseWriter, r *http.Request) { return err } else if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace build at \"after_id\"", - Internal: err.Error(), + Message: "Detail error fetching workspace build at \"after_id\"", + Detail: err.Error(), }) return err } @@ -87,8 +87,8 @@ func (api *API) workspaceBuilds(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace build", - Internal: err.Error(), + Message: "Detail error fetching workspace build", + Detail: err.Error(), }) return err } @@ -109,8 +109,8 @@ func (api *API) workspaceBuilds(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner jobs", - Internal: err.Error(), + Message: "Detail error fetching provisioner jobs", + Detail: err.Error(), }) return } @@ -154,16 +154,16 @@ func (api *API) workspaceBuildByName(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace build by name", - Internal: err.Error(), + Message: "Detail error fetching workspace build by name", + Detail: err.Error(), }) return } job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } @@ -201,8 +201,8 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { latestBuild, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), workspace.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error the latest workspace build", - Internal: err.Error(), + Message: "Detail error the latest workspace build", + Detail: err.Error(), }) return } @@ -221,16 +221,16 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template version", - Internal: err.Error(), + Message: "Detail error fetching template version", + Detail: err.Error(), }) return } templateVersionJob, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } @@ -256,8 +256,8 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { template, err := api.Database.GetTemplateByID(r.Context(), templateVersion.TemplateID.UUID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template job", - Internal: err.Error(), + Message: "Detail error fetching template job", + Detail: err.Error(), }) return } @@ -277,8 +277,8 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { priorBuildNum = priorHistory.BuildNumber } else if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching prior workspace build", - Internal: err.Error(), + Message: "Detail error fetching prior workspace build", + Detail: err.Error(), }) return } @@ -336,8 +336,8 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error inserting workspace build", - Internal: err.Error(), + Message: "Detail error inserting workspace build", + Detail: err.Error(), }) return } @@ -364,8 +364,8 @@ func (api *API) patchCancelWorkspaceBuild(rw http.ResponseWriter, r *http.Reques job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } @@ -390,8 +390,8 @@ func (api *API) patchCancelWorkspaceBuild(rw http.ResponseWriter, r *http.Reques }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error updating provisioner job", - Internal: err.Error(), + Message: "Detail error updating provisioner job", + Detail: err.Error(), }) return } @@ -418,8 +418,8 @@ func (api *API) workspaceBuildResources(rw http.ResponseWriter, r *http.Request) job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } @@ -444,8 +444,8 @@ func (api *API) workspaceBuildLogs(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } diff --git a/coderd/workspaceresourceauth.go b/coderd/workspaceresourceauth.go index 0d2621acd4a95..6a0ee464f8149 100644 --- a/coderd/workspaceresourceauth.go +++ b/coderd/workspaceresourceauth.go @@ -26,8 +26,8 @@ func (api *API) postWorkspaceAuthAzureInstanceIdentity(rw http.ResponseWriter, r instanceID, err := azureidentity.Validate(r.Context(), req.Signature, api.AzureCertificates) if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "Invalid azure identity", - Internal: err.Error(), + Message: "Invalid azure identity", + Detail: err.Error(), }) return } @@ -45,8 +45,8 @@ func (api *API) postWorkspaceAuthAWSInstanceIdentity(rw http.ResponseWriter, r * identity, err := awsidentity.Validate(req.Signature, req.Document, api.AWSCertificates) if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "Invalid aws identity", - Internal: err.Error(), + Message: "Invalid aws identity", + Detail: err.Error(), }) return } @@ -66,8 +66,8 @@ func (api *API) postWorkspaceAuthGoogleInstanceIdentity(rw http.ResponseWriter, payload, err := api.GoogleTokenValidator.Validate(r.Context(), req.JSONWebToken, "") if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "Invalid gcp identity", - Internal: err.Error(), + Message: "Invalid gcp identity", + Detail: err.Error(), }) return } @@ -81,8 +81,8 @@ func (api *API) postWorkspaceAuthGoogleInstanceIdentity(rw http.ResponseWriter, err = mapstructure.Decode(payload.Claims, &claims) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Error decoding jwt claims", - Internal: err.Error(), + Message: "Error decoding jwt claims", + Detail: err.Error(), }) return } @@ -99,24 +99,24 @@ func (api *API) handleAuthInstanceID(rw http.ResponseWriter, r *http.Request, in } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job agent", - Internal: err.Error(), + Message: "Detail error fetching provisioner job agent", + Detail: err.Error(), }) return } resource, err := api.Database.GetWorkspaceResourceByID(r.Context(), agent.ResourceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job resource", - Internal: err.Error(), + Message: "Detail error fetching provisioner job resource", + Detail: err.Error(), }) return } job, err := api.Database.GetProvisionerJobByID(r.Context(), resource.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } @@ -130,16 +130,16 @@ func (api *API) handleAuthInstanceID(rw http.ResponseWriter, r *http.Request, in err = json.Unmarshal(job.Input, &jobData) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error extracting job data", - Internal: err.Error(), + Message: "Detail error extracting job data", + Detail: err.Error(), }) return } resourceHistory, err := api.Database.GetWorkspaceBuildByID(r.Context(), jobData.WorkspaceBuildID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace build", - Internal: err.Error(), + Message: "Detail error fetching workspace build", + Detail: err.Error(), }) return } @@ -149,8 +149,8 @@ func (api *API) handleAuthInstanceID(rw http.ResponseWriter, r *http.Request, in latestHistory, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), resourceHistory.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error the latest workspace build", - Internal: err.Error(), + Message: "Detail error the latest workspace build", + Detail: err.Error(), }) return } diff --git a/coderd/workspaceresources.go b/coderd/workspaceresources.go index dcf99bb4de6f5..10b2ca998b38b 100644 --- a/coderd/workspaceresources.go +++ b/coderd/workspaceresources.go @@ -24,8 +24,8 @@ func (api *API) workspaceResource(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } @@ -41,8 +41,8 @@ func (api *API) workspaceResource(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job agents", - Internal: err.Error(), + Message: "Detail error fetching provisioner job agents", + Detail: err.Error(), }) return } @@ -51,8 +51,8 @@ func (api *API) workspaceResource(rw http.ResponseWriter, r *http.Request) { convertedAgent, err := convertWorkspaceAgent(agent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error reading workspace agent", - Internal: err.Error(), + Message: "Detail error reading workspace agent", + Detail: err.Error(), }) return } diff --git a/coderd/workspaces.go b/coderd/workspaces.go index aa42ff0201a22..522143cd75240 100644 --- a/coderd/workspaces.go +++ b/coderd/workspaces.go @@ -70,8 +70,8 @@ func (api *API) workspace(rw http.ResponseWriter, r *http.Request) { build, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), workspace.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace build", - Internal: err.Error(), + Message: "Detail error fetching workspace build", + Detail: err.Error(), }) return } @@ -96,8 +96,8 @@ func (api *API) workspace(rw http.ResponseWriter, r *http.Request) { err = group.Wait() if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching resource", - Internal: err.Error(), + Message: "Detail error fetching resource", + Detail: err.Error(), }) return } @@ -116,8 +116,8 @@ func (api *API) workspacesByOrganization(rw http.ResponseWriter, r *http.Request } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspaces", - Internal: err.Error(), + Message: "Detail error fetching workspaces", + Detail: err.Error(), }) return } @@ -128,8 +128,8 @@ func (api *API) workspacesByOrganization(rw http.ResponseWriter, r *http.Request apiWorkspaces, err := convertWorkspaces(r.Context(), api.Database, workspaces) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error reading workspaces", - Internal: err.Error(), + Message: "Detail error reading workspaces", + Detail: err.Error(), }) return } @@ -150,8 +150,8 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { orgID, err := uuid.Parse(orgFilter) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Query param \"organization_id\" must be a valid uuid", - Internal: err.Error(), + Message: "Query param \"organization_id\" must be a valid uuid", + Detail: err.Error(), Errors: []httpapi.Error{ {Field: "organization_id", Detail: "Must be a valid uuid"}, }, @@ -173,8 +173,8 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Query param \"owner\" must be a valid uuid or username", - Internal: err.Error(), + Message: "Query param \"owner\" must be a valid uuid or username", + Detail: err.Error(), Errors: []httpapi.Error{ {Field: "owner", Detail: "Must be a valid uuid or username"}, }, @@ -189,8 +189,8 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { workspaces, err := api.Database.GetWorkspacesWithFilter(r.Context(), filter) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspaces", - Internal: err.Error(), + Message: "Detail error fetching workspaces", + Detail: err.Error(), }) return } @@ -201,8 +201,8 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { apiWorkspaces, err := convertWorkspaces(r.Context(), api.Database, workspaces) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error reading workspaces", - Internal: err.Error(), + Message: "Detail error reading workspaces", + Detail: err.Error(), }) return } @@ -220,8 +220,8 @@ func (api *API) workspacesByOwner(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspaces", - Internal: err.Error(), + Message: "Detail error fetching workspaces", + Detail: err.Error(), }) return } @@ -232,8 +232,8 @@ func (api *API) workspacesByOwner(rw http.ResponseWriter, r *http.Request) { apiWorkspaces, err := convertWorkspaces(r.Context(), api.Database, workspaces) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error reading workspaces", - Internal: err.Error(), + Message: "Detail error reading workspaces", + Detail: err.Error(), }) return } @@ -256,8 +256,8 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request) } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace by name", - Internal: err.Error(), + Message: "Detail error fetching workspace by name", + Detail: err.Error(), }) return } @@ -276,24 +276,24 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request) build, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), workspace.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace build", - Internal: err.Error(), + Message: "Detail error fetching workspace build", + Detail: err.Error(), }) return } job, err := api.Database.GetProvisionerJobByID(r.Context(), build.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching provisioner job", - Internal: err.Error(), + Message: "Detail error fetching provisioner job", + Detail: err.Error(), }) return } template, err := api.Database.GetTemplateByID(r.Context(), workspace.TemplateID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template", - Internal: err.Error(), + Message: "Detail error fetching template", + Detail: err.Error(), }) return } @@ -328,8 +328,8 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template", - Internal: err.Error(), + Message: "Detail error fetching template", + Detail: err.Error(), }) return } @@ -352,8 +352,8 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching organization member", - Internal: err.Error(), + Message: "Detail error fetching organization member", + Detail: err.Error(), }) return } @@ -363,8 +363,8 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req _, err := schedule.Weekly(*createWorkspace.AutostartSchedule) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Error parsing autostart schedule", - Internal: err.Error(), + Message: "Error parsing autostart schedule", + Detail: err.Error(), }) return } @@ -375,8 +375,8 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req dbTTL, err := validWorkspaceTTLMillis(createWorkspace.TTLMillis) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Invalid workspace ttl", - Internal: err.Error(), + Message: "Invalid workspace ttl", + Detail: err.Error(), Errors: []httpapi.Error{ { Field: "ttl", @@ -396,8 +396,8 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req template, err := api.Database.GetTemplateByID(r.Context(), workspace.TemplateID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Find template for conflicting workspace name %q", createWorkspace.Name), - Internal: err.Error(), + Message: fmt.Sprintf("Find template for conflicting workspace name %q", createWorkspace.Name), + Detail: err.Error(), }) return } @@ -413,8 +413,8 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Internal error fetching workspace by name %q", createWorkspace.Name), - Internal: err.Error(), + Message: fmt.Sprintf("Detail error fetching workspace by name %q", createWorkspace.Name), + Detail: err.Error(), }) return } @@ -422,16 +422,16 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req templateVersion, err := api.Database.GetTemplateVersionByID(r.Context(), template.ActiveVersionID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template version", - Internal: err.Error(), + Message: "Detail error fetching template version", + Detail: err.Error(), }) return } templateVersionJob, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching template version job", - Internal: err.Error(), + Message: "Detail error fetching template version job", + Detail: err.Error(), }) return } @@ -532,16 +532,16 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error creating workspace", - Internal: err.Error(), + Message: "Detail error creating workspace", + Detail: err.Error(), }) return } user, err := api.Database.GetUserByID(r.Context(), apiKey.UserID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user", - Internal: err.Error(), + Message: "Detail error fetching user", + Detail: err.Error(), }) return } @@ -564,8 +564,8 @@ func (api *API) putWorkspaceAutostart(rw http.ResponseWriter, r *http.Request) { dbSched, err := validWorkspaceSchedule(req.Schedule) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Invalid autostart schedule", - Internal: err.Error(), + Message: "Invalid autostart schedule", + Detail: err.Error(), }) return } @@ -576,8 +576,8 @@ func (api *API) putWorkspaceAutostart(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error updating workspace autostart schedule", - Internal: err.Error(), + Message: "Detail error updating workspace autostart schedule", + Detail: err.Error(), }) return } @@ -598,8 +598,8 @@ func (api *API) putWorkspaceTTL(rw http.ResponseWriter, r *http.Request) { dbTTL, err := validWorkspaceTTLMillis(req.TTLMillis) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Invalid workspace ttl", - Internal: err.Error(), + Message: "Invalid workspace ttl", + Detail: err.Error(), Errors: []httpapi.Error{ { Field: "ttl", @@ -616,8 +616,8 @@ func (api *API) putWorkspaceTTL(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error updating workspace ttl", - Internal: err.Error(), + Message: "Detail error updating workspace ttl", + Detail: err.Error(), }) return } @@ -729,16 +729,16 @@ func (api *API) watchWorkspace(rw http.ResponseWriter, r *http.Request) { workspace, err := api.Database.GetWorkspaceByID(r.Context(), workspace.ID) if err != nil { _ = wsjson.Write(ctx, c, httpapi.Response{ - Message: "Internal error fetching workspace", - Internal: err.Error(), + Message: "Detail error fetching workspace", + Detail: err.Error(), }) return } build, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), workspace.ID) if err != nil { _ = wsjson.Write(ctx, c, httpapi.Response{ - Message: "Internal error fetching workspace build", - Internal: err.Error(), + Message: "Detail error fetching workspace build", + Detail: err.Error(), }) return } @@ -763,8 +763,8 @@ func (api *API) watchWorkspace(rw http.ResponseWriter, r *http.Request) { err = group.Wait() if err != nil { _ = wsjson.Write(ctx, c, httpapi.Response{ - Message: "Internal error fetching resource", - Internal: err.Error(), + Message: "Detail error fetching resource", + Detail: err.Error(), }) return } diff --git a/codersdk/client.go b/codersdk/client.go index 0a0b9d1b6f93a..eacc80c5f74bc 100644 --- a/codersdk/client.go +++ b/codersdk/client.go @@ -202,8 +202,8 @@ func (e *Error) Error() string { if e.Helper != "" { _, _ = fmt.Fprintf(&builder, ": %s", e.Helper) } - if e.Internal != "" { - _, _ = fmt.Fprintf(&builder, "\n\tError: %s", e.Internal) + if e.Detail != "" { + _, _ = fmt.Fprintf(&builder, "\n\tError: %s", e.Detail) } for _, err := range e.Errors { _, _ = fmt.Fprintf(&builder, "\n\t%s: %s", err.Field, err.Detail) From 5d59312c3397d9677e3bf704af1d5d4f39fda2b9 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 15:51:04 -0500 Subject: [PATCH 14/21] Rename "Errors" -> "Validations" --- coderd/httpapi/httpapi.go | 25 ++++++++++++++----------- coderd/httpapi/httpapi_test.go | 6 +++--- coderd/pagination.go | 6 +++--- coderd/parameters.go | 4 ++-- coderd/provisionerjobs.go | 4 ++-- coderd/templates.go | 4 ++-- coderd/users.go | 10 +++++----- coderd/workspaceagents.go | 2 +- coderd/workspacebuilds.go | 2 +- coderd/workspaces.go | 16 ++++++++-------- codersdk/client.go | 2 +- 11 files changed, 42 insertions(+), 39 deletions(-) diff --git a/coderd/httpapi/httpapi.go b/coderd/httpapi/httpapi.go index 54353c16f0b1c..06c8efa5a5900 100644 --- a/coderd/httpapi/httpapi.go +++ b/coderd/httpapi/httpapi.go @@ -52,19 +52,22 @@ func init() { // Response represents a generic HTTP response. type Response struct { - // Message is for general user-friendly error messages. This message will - // be shown at the top/bottom of a form, or in a toast on the UI. + // Message is an actionable message that depicts actions the request took. + // These messages should be fully formed sentences with proper punctuation. + // Examples: + // - "A user has been created." + // - "Failed to create a user." Message string `json:"message"` - // Detail has the technical error information (err.Error()). These details - // might come from external packages and might not be user friendly. - // Do not populate this error field with any sensitive information or - // any errors that may be a security implication. These details are still - // available to more technical users. + // Detail is a debug message that provides further insight into why the + // action failed. This information can be technical and a regular golang + // err.Error() text. + // - "database: too many open connections" + // - "stat: too many open files" Detail string `json:"detail"` - // Errors are form field-specific friendly error messages. They will be + // Validations are form field-specific friendly error messages. They will be // shown on a form field in the UI. These can also be used to add additional // context if there is a set of errors in the primary 'Message'. - Errors []Error `json:"errors,omitempty"` + Validations []Error `json:"errors,omitempty"` } // Error represents a scoped error to a user input. @@ -120,8 +123,8 @@ func Read(rw http.ResponseWriter, r *http.Request, value interface{}) bool { }) } Write(rw, http.StatusBadRequest, Response{ - Message: "Validation failed", - Errors: apiErrors, + Message: "Validation failed", + Validations: apiErrors, }) return false } diff --git a/coderd/httpapi/httpapi_test.go b/coderd/httpapi/httpapi_test.go index 20f7af5c08ab1..e457f69f64b5a 100644 --- a/coderd/httpapi/httpapi_test.go +++ b/coderd/httpapi/httpapi_test.go @@ -74,9 +74,9 @@ func TestRead(t *testing.T) { var v httpapi.Response err := json.NewDecoder(rw.Body).Decode(&v) require.NoError(t, err) - require.Len(t, v.Errors, 1) - require.Equal(t, "value", v.Errors[0].Field) - require.Equal(t, "Validation failed for tag \"required\" with value: \"\"", v.Errors[0].Detail) + require.Len(t, v.Validations, 1) + require.Equal(t, "value", v.Validations[0].Field) + require.Equal(t, "Validation failed for tag \"required\" with value: \"\"", v.Validations[0].Detail) }) } diff --git a/coderd/pagination.go b/coderd/pagination.go index bd90469a0e519..1fd42dcbdaa77 100644 --- a/coderd/pagination.go +++ b/coderd/pagination.go @@ -26,7 +26,7 @@ func parsePagination(w http.ResponseWriter, r *http.Request) (p codersdk.Paginat httpapi.Write(w, http.StatusBadRequest, httpapi.Response{ Message: "Query param 'after_id' must be a valid uuid", Detail: err.Error(), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ {Field: "after_id", Detail: err.Error()}, }, }) @@ -39,7 +39,7 @@ func parsePagination(w http.ResponseWriter, r *http.Request) (p codersdk.Paginat httpapi.Write(w, http.StatusBadRequest, httpapi.Response{ Message: "Query param 'limit' must be a valid integer", Detail: err.Error(), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ {Field: "limit", Detail: err.Error()}, }, }) @@ -52,7 +52,7 @@ func parsePagination(w http.ResponseWriter, r *http.Request) (p codersdk.Paginat httpapi.Write(w, http.StatusBadRequest, httpapi.Response{ Message: "Query param 'offset' must be a valid integer", Detail: err.Error(), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ {Field: "offset", Detail: err.Error()}, }, }) diff --git a/coderd/parameters.go b/coderd/parameters.go index 3bd3dc37a5b95..4ee318a665558 100644 --- a/coderd/parameters.go +++ b/coderd/parameters.go @@ -258,7 +258,7 @@ func readScopeAndID(rw http.ResponseWriter, r *http.Request) (database.Parameter default: httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: fmt.Sprintf("Invalid scope %q", scope), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ {Field: "scope", Detail: "invalid scope"}, }, }) @@ -271,7 +271,7 @@ func readScopeAndID(rw http.ResponseWriter, r *http.Request) (database.Parameter httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: fmt.Sprintf("Invalid uuid %q", id), Detail: err.Error(), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ {Field: "id", Detail: "Invalid uuid"}, }, }) diff --git a/coderd/provisionerjobs.go b/coderd/provisionerjobs.go index ed97fef81310d..4e391a19bafec 100644 --- a/coderd/provisionerjobs.go +++ b/coderd/provisionerjobs.go @@ -45,7 +45,7 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: "Query param \"after\" must be an integer", Detail: err.Error(), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ {Field: "after", Detail: "Must be an integer"}, }, }) @@ -65,7 +65,7 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: "Query param \"before\" must be an integer", Detail: err.Error(), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ {Field: "before", Detail: "Must be an integer"}, }, }) diff --git a/coderd/templates.go b/coderd/templates.go index 6414911303413..f97fb0b8b4acf 100644 --- a/coderd/templates.go +++ b/coderd/templates.go @@ -104,7 +104,7 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque if err == nil { httpapi.Write(rw, http.StatusConflict, httpapi.Response{ Message: fmt.Sprintf("Template with name %q already exists", createTemplate.Name), - Errors: []httpapi.Error{{ + Validations: []httpapi.Error{{ Field: "name", Detail: "This value is already in use and should be unique.", }}, @@ -122,7 +122,7 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusNotFound, httpapi.Response{ Message: fmt.Sprintf("Template version %q does not exist", createTemplate.VersionID), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ {Field: "template_version_id", Detail: "Template version does not exist"}, }, }) diff --git a/coderd/users.go b/coderd/users.go index d7a74e8fb739a..9ff0d4d4472df 100644 --- a/coderd/users.go +++ b/coderd/users.go @@ -125,7 +125,7 @@ func (api *API) users(rw http.ResponseWriter, r *http.Request) { default: httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: fmt.Sprintf("%q is not a valid user status", filter), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ {Field: "status", Detail: "invalid status"}, }, }) @@ -298,8 +298,8 @@ func (api *API) putUserProfile(rw http.ResponseWriter, r *http.Request) { }) } httpapi.Write(rw, http.StatusConflict, httpapi.Response{ - Message: "User already exists", - Errors: responseErrors, + Message: "User already exists", + Validations: responseErrors, }) return } @@ -400,7 +400,7 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: "Invalid password", - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ { Field: "password", Detail: err.Error(), @@ -425,7 +425,7 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { if !ok { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: "Old password is incorrect", - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ { Field: "old_password", Detail: "Old password is incorrect.", diff --git a/coderd/workspaceagents.go b/coderd/workspaceagents.go index 9434d554725d0..d49a3af2fb637 100644 --- a/coderd/workspaceagents.go +++ b/coderd/workspaceagents.go @@ -378,7 +378,7 @@ func (api *API) workspaceAgentPTY(rw http.ResponseWriter, r *http.Request) { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: "Query param 'reconnect' must be a valid uuid", Detail: err.Error(), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ {Field: "reconnect", Detail: "invalid uuid"}, }, }) diff --git a/coderd/workspacebuilds.go b/coderd/workspacebuilds.go index 347c1cdfc8454..5593e1d7f06cc 100644 --- a/coderd/workspacebuilds.go +++ b/coderd/workspacebuilds.go @@ -212,7 +212,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: "Template version not found", - Errors: []httpapi.Error{{ + Validations: []httpapi.Error{{ Field: "template_version_id", Detail: "template version not found", }}, diff --git a/coderd/workspaces.go b/coderd/workspaces.go index 522143cd75240..a8f1e1c26e901 100644 --- a/coderd/workspaces.go +++ b/coderd/workspaces.go @@ -47,7 +47,7 @@ func (api *API) workspace(rw http.ResponseWriter, r *http.Request) { if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: fmt.Sprintf("Invalid boolean value %q for \"deleted\" query param", deletedStr), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ {Field: "deleted", Detail: "Must be a valid boolean"}, }, }) @@ -152,7 +152,7 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: "Query param \"organization_id\" must be a valid uuid", Detail: err.Error(), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ {Field: "organization_id", Detail: "Must be a valid uuid"}, }, }) @@ -175,7 +175,7 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: "Query param \"owner\" must be a valid uuid or username", Detail: err.Error(), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ {Field: "owner", Detail: "Must be a valid uuid or username"}, }, }) @@ -319,7 +319,7 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: fmt.Sprintf("Template %q doesn't exist", createWorkspace.TemplateID.String()), - Errors: []httpapi.Error{{ + Validations: []httpapi.Error{{ Field: "template_id", Detail: "template not found", }}, @@ -377,7 +377,7 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: "Invalid workspace ttl", Detail: err.Error(), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ { Field: "ttl", Detail: err.Error(), @@ -404,7 +404,7 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req // The template is fetched for clarity to the user on where the conflicting name may be. httpapi.Write(rw, http.StatusConflict, httpapi.Response{ Message: fmt.Sprintf("Workspace %q already exists in the %q template", createWorkspace.Name, template.Name), - Errors: []httpapi.Error{{ + Validations: []httpapi.Error{{ Field: "name", Detail: "this value is already in use and should be unique", }}, @@ -600,7 +600,7 @@ func (api *API) putWorkspaceTTL(rw http.ResponseWriter, r *http.Request) { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: "Invalid workspace ttl", Detail: err.Error(), - Errors: []httpapi.Error{ + Validations: []httpapi.Error{ { Field: "ttl", Detail: err.Error(), @@ -656,7 +656,7 @@ func (api *API) putExtendWorkspace(rw http.ResponseWriter, r *http.Request) { if err := validWorkspaceDeadline(build.Deadline, newDeadline); err != nil { code = http.StatusBadRequest resp.Message = "bad extend workspace request" - resp.Errors = append(resp.Errors, httpapi.Error{Field: "deadline", Detail: err.Error()}) + resp.Validations = append(resp.Validations, httpapi.Error{Field: "deadline", Detail: err.Error()}) return err } diff --git a/codersdk/client.go b/codersdk/client.go index eacc80c5f74bc..c8e613a631202 100644 --- a/codersdk/client.go +++ b/codersdk/client.go @@ -205,7 +205,7 @@ func (e *Error) Error() string { if e.Detail != "" { _, _ = fmt.Fprintf(&builder, "\n\tError: %s", e.Detail) } - for _, err := range e.Errors { + for _, err := range e.Validations { _, _ = fmt.Fprintf(&builder, "\n\t%s: %s", err.Field, err.Detail) } return builder.String() From a8e78bbe7df4adffa2440bd4ec87561d1004b0ba Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 15:55:29 -0500 Subject: [PATCH 15/21] Fix proper captalization --- coderd/httpmw/apikey.go | 8 ++++---- coderd/httpmw/httpmw.go | 2 +- coderd/pagination.go | 2 +- coderd/parameters.go | 4 ++-- coderd/workspaceagents.go | 4 ++-- coderd/workspaces.go | 14 +++++++------- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/coderd/httpmw/apikey.go b/coderd/httpmw/apikey.go index 291546ef525a3..ca36a8a6947a0 100644 --- a/coderd/httpmw/apikey.go +++ b/coderd/httpmw/apikey.go @@ -96,7 +96,7 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h if err != nil { if errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "Api key is invalid", + Message: "API key is invalid", }) return } @@ -111,7 +111,7 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h // Checking to see if the secret is valid. if subtle.ConstantTimeCompare(key.HashedSecret, hashed[:]) != 1 { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "Api key secret is invalid", + Message: "API key secret is invalid", }) return } @@ -156,7 +156,7 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h // Checking if the key is expired. if key.ExpiresAt.Before(now) { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("Api key expired at %q", key.ExpiresAt.String()), + Message: fmt.Sprintf("API key expired at %q", key.ExpiresAt.String()), }) return } @@ -184,7 +184,7 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Api key couldn't update: %s", err.Error()), + Message: fmt.Sprintf("API key couldn't update: %s", err.Error()), }) return } diff --git a/coderd/httpmw/httpmw.go b/coderd/httpmw/httpmw.go index a39e5cbaa06ce..d183a1602160f 100644 --- a/coderd/httpmw/httpmw.go +++ b/coderd/httpmw/httpmw.go @@ -25,7 +25,7 @@ func parseUUID(rw http.ResponseWriter, r *http.Request, param string) (uuid.UUID parsed, err := uuid.Parse(rawID) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("Invalid uuid %q", param), + Message: fmt.Sprintf("Invalid UUID %q", param), Detail: err.Error(), }) return uuid.UUID{}, false diff --git a/coderd/pagination.go b/coderd/pagination.go index 1fd42dcbdaa77..553d1c09cf89e 100644 --- a/coderd/pagination.go +++ b/coderd/pagination.go @@ -24,7 +24,7 @@ func parsePagination(w http.ResponseWriter, r *http.Request) (p codersdk.Paginat afterID, err = uuid.Parse(r.URL.Query().Get("after_id")) if err != nil { httpapi.Write(w, http.StatusBadRequest, httpapi.Response{ - Message: "Query param 'after_id' must be a valid uuid", + Message: "Query param 'after_id' must be a valid UUID", Detail: err.Error(), Validations: []httpapi.Error{ {Field: "after_id", Detail: err.Error()}, diff --git a/coderd/parameters.go b/coderd/parameters.go index 4ee318a665558..6b45d25ad813b 100644 --- a/coderd/parameters.go +++ b/coderd/parameters.go @@ -269,10 +269,10 @@ func readScopeAndID(rw http.ResponseWriter, r *http.Request) (database.Parameter uid, err := uuid.Parse(id) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("Invalid uuid %q", id), + Message: fmt.Sprintf("Invalid UUID %q", id), Detail: err.Error(), Validations: []httpapi.Error{ - {Field: "id", Detail: "Invalid uuid"}, + {Field: "id", Detail: "Invalid UUID"}, }, }) return scope, uuid.Nil, false diff --git a/coderd/workspaceagents.go b/coderd/workspaceagents.go index d49a3af2fb637..a93e1d51516d5 100644 --- a/coderd/workspaceagents.go +++ b/coderd/workspaceagents.go @@ -376,10 +376,10 @@ func (api *API) workspaceAgentPTY(rw http.ResponseWriter, r *http.Request) { reconnect, err := uuid.Parse(r.URL.Query().Get("reconnect")) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Query param 'reconnect' must be a valid uuid", + Message: "Query param 'reconnect' must be a valid UUID", Detail: err.Error(), Validations: []httpapi.Error{ - {Field: "reconnect", Detail: "invalid uuid"}, + {Field: "reconnect", Detail: "invalid UUID"}, }, }) return diff --git a/coderd/workspaces.go b/coderd/workspaces.go index a8f1e1c26e901..cc9bcb6376125 100644 --- a/coderd/workspaces.go +++ b/coderd/workspaces.go @@ -150,10 +150,10 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { orgID, err := uuid.Parse(orgFilter) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Query param \"organization_id\" must be a valid uuid", + Message: "Query param \"organization_id\" must be a valid UUID", Detail: err.Error(), Validations: []httpapi.Error{ - {Field: "organization_id", Detail: "Must be a valid uuid"}, + {Field: "organization_id", Detail: "Must be a valid UUID"}, }, }) return @@ -173,10 +173,10 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Query param \"owner\" must be a valid uuid or username", + Message: "Query param \"owner\" must be a valid UUID or username", Detail: err.Error(), Validations: []httpapi.Error{ - {Field: "owner", Detail: "Must be a valid uuid or username"}, + {Field: "owner", Detail: "Must be a valid UUID or username"}, }, }) return @@ -375,7 +375,7 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req dbTTL, err := validWorkspaceTTLMillis(createWorkspace.TTLMillis) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Invalid workspace ttl", + Message: "Invalid workspace TTL", Detail: err.Error(), Validations: []httpapi.Error{ { @@ -598,7 +598,7 @@ func (api *API) putWorkspaceTTL(rw http.ResponseWriter, r *http.Request) { dbTTL, err := validWorkspaceTTLMillis(req.TTLMillis) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Invalid workspace ttl", + Message: "Invalid workspace TTL", Detail: err.Error(), Validations: []httpapi.Error{ { @@ -616,7 +616,7 @@ func (api *API) putWorkspaceTTL(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error updating workspace ttl", + Message: "Detail error updating workspace TTL", Detail: err.Error(), }) return From ee2f5471383bd6927ff9ff2540a7938ca6122a7e Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 15:58:34 -0500 Subject: [PATCH 16/21] Fix typo --- coderd/files.go | 4 ++-- coderd/organizations.go | 4 ++-- coderd/parameters.go | 10 ++++----- coderd/provisionerdaemons.go | 2 +- coderd/provisionerjobs.go | 12 +++++----- coderd/templates.go | 22 +++++++++--------- coderd/templateversions.go | 24 ++++++++++---------- coderd/userauth.go | 10 ++++----- coderd/users.go | 40 ++++++++++++++++----------------- coderd/workspaceagents.go | 16 ++++++------- coderd/workspacebuilds.go | 18 +++++++-------- coderd/workspaceresourceauth.go | 12 +++++----- coderd/workspaceresources.go | 6 ++--- coderd/workspaces.go | 32 +++++++++++++------------- 14 files changed, 106 insertions(+), 106 deletions(-) diff --git a/coderd/files.go b/coderd/files.go index c7aac87c913e6..c919b4f477ddd 100644 --- a/coderd/files.go +++ b/coderd/files.go @@ -65,7 +65,7 @@ func (api *API) postFile(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error saving file", + Message: "Internal error saving file", Detail: err.Error(), }) return @@ -91,7 +91,7 @@ func (api *API) fileByHash(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Detail error fetching file"), + Message: fmt.Sprintf("Internal error fetching file"), Detail: err.Error(), }) return diff --git a/coderd/organizations.go b/coderd/organizations.go index b821351f1de0c..e8d569af9344b 100644 --- a/coderd/organizations.go +++ b/coderd/organizations.go @@ -51,7 +51,7 @@ func (api *API) postOrganizations(rw http.ResponseWriter, r *http.Request) { } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Detail error fetching organization %q", req.Name), + Message: fmt.Sprintf("Internal error fetching organization %q", req.Name), Detail: err.Error(), }) return @@ -84,7 +84,7 @@ func (api *API) postOrganizations(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error inserting organization member", + Message: "Internal error inserting organization member", Detail: err.Error(), }) return diff --git a/coderd/parameters.go b/coderd/parameters.go index 6b45d25ad813b..b66d6b668e5d9 100644 --- a/coderd/parameters.go +++ b/coderd/parameters.go @@ -47,7 +47,7 @@ func (api *API) postParameter(rw http.ResponseWriter, r *http.Request) { } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching parameter", + Message: "Internal error fetching parameter", Detail: err.Error(), }) return @@ -66,7 +66,7 @@ func (api *API) postParameter(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error inserting parameter", + Message: "Internal error inserting parameter", Detail: err.Error(), }) return @@ -98,7 +98,7 @@ func (api *API) parameters(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching parameter scope values", + Message: "Internal error fetching parameter scope values", Detail: err.Error(), }) return @@ -140,7 +140,7 @@ func (api *API) deleteParameter(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Detail error fetching parameter"), + Message: fmt.Sprintf("Internal error fetching parameter"), Detail: err.Error(), }) return @@ -148,7 +148,7 @@ func (api *API) deleteParameter(rw http.ResponseWriter, r *http.Request) { err = api.Database.DeleteParameterValueByID(r.Context(), parameterValue.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Detail error deleting parameter"), + Message: fmt.Sprintf("Internal error deleting parameter"), Detail: err.Error(), }) return diff --git a/coderd/provisionerdaemons.go b/coderd/provisionerdaemons.go index 9b4eba1323b79..2647636c36278 100644 --- a/coderd/provisionerdaemons.go +++ b/coderd/provisionerdaemons.go @@ -38,7 +38,7 @@ func (api *API) provisionerDaemons(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner daemons", + Message: "Internal error fetching provisioner daemons", Detail: err.Error(), }) return diff --git a/coderd/provisionerjobs.go b/coderd/provisionerjobs.go index 4e391a19bafec..861843f8ce2bd 100644 --- a/coderd/provisionerjobs.go +++ b/coderd/provisionerjobs.go @@ -87,7 +87,7 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner logs", + Message: "Internal error fetching provisioner logs", Detail: err.Error(), }) return @@ -121,7 +121,7 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error watching provisioner logs", + Message: "Internal error watching provisioner logs", Detail: err.Error(), }) return @@ -138,7 +138,7 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner logs", + Message: "Internal error fetching provisioner logs", Detail: err.Error(), }) return @@ -202,7 +202,7 @@ func (api *API) provisionerJobResources(rw http.ResponseWriter, r *http.Request, } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching job resources", + Message: "Internal error fetching job resources", Detail: err.Error(), }) return @@ -217,7 +217,7 @@ func (api *API) provisionerJobResources(rw http.ResponseWriter, r *http.Request, } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace agent", + Message: "Internal error fetching workspace agent", Detail: err.Error(), }) return @@ -233,7 +233,7 @@ func (api *API) provisionerJobResources(rw http.ResponseWriter, r *http.Request, apiAgent, err := convertWorkspaceAgent(agent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error reading job agent", + Message: "Internal error reading job agent", Detail: err.Error(), }) return diff --git a/coderd/templates.go b/coderd/templates.go index f97fb0b8b4acf..4e9ff17feb155 100644 --- a/coderd/templates.go +++ b/coderd/templates.go @@ -27,7 +27,7 @@ func (api *API) template(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace count", + Message: "Internal error fetching workspace count", Detail: err.Error(), }) return @@ -59,7 +59,7 @@ func (api *API) deleteTemplate(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspaces by template id", + Message: "Internal error fetching workspaces by template id", Detail: err.Error(), }) return @@ -76,7 +76,7 @@ func (api *API) deleteTemplate(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error deleting template", + Message: "Internal error deleting template", Detail: err.Error(), }) return @@ -113,7 +113,7 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching template by name", + Message: "Internal error fetching template by name", Detail: err.Error(), }) return @@ -130,7 +130,7 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching template version", + Message: "Internal error fetching template version", Detail: err.Error(), }) return @@ -138,7 +138,7 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque importJob, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return @@ -194,7 +194,7 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error inserting template", + Message: "Internal error inserting template", Detail: err.Error(), }) return @@ -213,7 +213,7 @@ func (api *API) templatesByOrganization(rw http.ResponseWriter, r *http.Request) } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching templates in organization", + Message: "Internal error fetching templates in organization", Detail: err.Error(), }) return @@ -233,7 +233,7 @@ func (api *API) templatesByOrganization(rw http.ResponseWriter, r *http.Request) } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace counts", + Message: "Internal error fetching workspace counts", Detail: err.Error(), }) return @@ -258,7 +258,7 @@ func (api *API) templateByOrganizationAndName(rw http.ResponseWriter, r *http.Re } httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching template", + Message: "Internal error fetching template", Detail: err.Error(), }) return @@ -274,7 +274,7 @@ func (api *API) templateByOrganizationAndName(rw http.ResponseWriter, r *http.Re } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace counts", + Message: "Internal error fetching workspace counts", Detail: err.Error(), }) return diff --git a/coderd/templateversions.go b/coderd/templateversions.go index dcab033963d8e..03c7850623fc4 100644 --- a/coderd/templateversions.go +++ b/coderd/templateversions.go @@ -29,7 +29,7 @@ func (api *API) templateVersion(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return @@ -47,7 +47,7 @@ func (api *API) patchCancelTemplateVersion(rw http.ResponseWriter, r *http.Reque job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return @@ -73,7 +73,7 @@ func (api *API) patchCancelTemplateVersion(rw http.ResponseWriter, r *http.Reque }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error updating provisioner job", + Message: "Internal error updating provisioner job", Detail: err.Error(), }) return @@ -92,7 +92,7 @@ func (api *API) templateVersionSchema(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return @@ -109,7 +109,7 @@ func (api *API) templateVersionSchema(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error listing parameter schemas", + Message: "Internal error listing parameter schemas", Detail: err.Error(), }) return @@ -119,7 +119,7 @@ func (api *API) templateVersionSchema(rw http.ResponseWriter, r *http.Request) { apiSchema, err := convertParameterSchema(schema) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Detail error converting schema %s", schema.Name), + Message: fmt.Sprintf("Internal error converting schema %s", schema.Name), Detail: err.Error(), }) return @@ -139,7 +139,7 @@ func (api *API) templateVersionParameters(rw http.ResponseWriter, r *http.Reques job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return @@ -160,7 +160,7 @@ func (api *API) templateVersionParameters(rw http.ResponseWriter, r *http.Reques }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error computing values", + Message: "Internal error computing values", Detail: err.Error(), }) return @@ -193,7 +193,7 @@ func (api *API) postTemplateVersionDryRun(rw http.ResponseWriter, r *http.Reques job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error updating provisioner job", + Message: "Internal error updating provisioner job", Detail: err.Error(), }) return @@ -228,7 +228,7 @@ func (api *API) postTemplateVersionDryRun(rw http.ResponseWriter, r *http.Reques }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error unmarshalling provisioner job", + Message: "Internal error unmarshalling provisioner job", Detail: err.Error(), }) return @@ -250,7 +250,7 @@ func (api *API) postTemplateVersionDryRun(rw http.ResponseWriter, r *http.Reques }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error inserting provisioner job", + Message: "Internal error inserting provisioner job", Detail: err.Error(), }) return @@ -320,7 +320,7 @@ func (api *API) patchTemplateVersionDryRunCancel(rw http.ResponseWriter, r *http }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error updating provisioner job", + Message: "Internal error updating provisioner job", Detail: err.Error(), }) return diff --git a/coderd/userauth.go b/coderd/userauth.go index 46d9fedab9460..a2b1c0b3ace1c 100644 --- a/coderd/userauth.go +++ b/coderd/userauth.go @@ -42,7 +42,7 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { memberships, err := api.GithubOAuth2Config.ListOrganizationMemberships(r.Context(), oauthClient) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching authenticated github user organizations", + Message: "Internal error fetching authenticated github user organizations", Detail: err.Error(), }) return @@ -67,7 +67,7 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { emails, err := api.GithubOAuth2Config.ListEmails(r.Context(), oauthClient) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching personal github user", + Message: "Internal error fetching personal github user", Detail: err.Error(), }) return @@ -88,7 +88,7 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Detail error fetching user by email %q", *email.Email), + Message: fmt.Sprintf("Internal error fetching user by email %q", *email.Email), Detail: err.Error(), }) return @@ -122,7 +122,7 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { ghUser, err := api.GithubOAuth2Config.AuthenticatedUser(r.Context(), oauthClient) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching authenticated github user", + Message: "Internal error fetching authenticated github user", Detail: err.Error(), }) return @@ -148,7 +148,7 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error creating user", + Message: "Internal error creating user", Detail: err.Error(), }) return diff --git a/coderd/users.go b/coderd/users.go index 9ff0d4d4472df..99f3ab0852b69 100644 --- a/coderd/users.go +++ b/coderd/users.go @@ -30,7 +30,7 @@ func (api *API) firstUser(rw http.ResponseWriter, r *http.Request) { userCount, err := api.Database.GetUserCount(r.Context()) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching user count", + Message: "Internal error fetching user count", Detail: err.Error(), }) return @@ -59,7 +59,7 @@ func (api *API) postFirstUser(rw http.ResponseWriter, r *http.Request) { userCount, err := api.Database.GetUserCount(r.Context()) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching user count", + Message: "Internal error fetching user count", Detail: err.Error(), }) return @@ -80,7 +80,7 @@ func (api *API) postFirstUser(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error creating user", + Message: "Internal error creating user", Detail: err.Error(), }) return @@ -96,7 +96,7 @@ func (api *API) postFirstUser(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error updating user's roles", + Message: "Internal error updating user's roles", Detail: err.Error(), }) return @@ -157,7 +157,7 @@ func (api *API) users(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching users", + Message: "Internal error fetching users", Detail: err.Error(), }) return @@ -173,7 +173,7 @@ func (api *API) users(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching user's organizations", + Message: "Internal error fetching user's organizations", Detail: err.Error(), }) return @@ -219,7 +219,7 @@ func (api *API) postUser(rw http.ResponseWriter, r *http.Request) { } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching user", + Message: "Internal error fetching user", Detail: err.Error(), }) return @@ -234,7 +234,7 @@ func (api *API) postUser(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching organization", + Message: "Internal error fetching organization", Detail: err.Error(), }) return @@ -243,7 +243,7 @@ func (api *API) postUser(rw http.ResponseWriter, r *http.Request) { user, _, err := api.createUser(r.Context(), createUser) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error creating user", + Message: "Internal error creating user", Detail: err.Error(), }) return @@ -264,7 +264,7 @@ func (api *API) userByName(rw http.ResponseWriter, r *http.Request) { if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching user's organizations", + Message: "Internal error fetching user's organizations", Detail: err.Error(), }) return @@ -305,7 +305,7 @@ func (api *API) putUserProfile(rw http.ResponseWriter, r *http.Request) { } if !errors.Is(err, sql.ErrNoRows) && isDifferentUser { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching user", + Message: "Internal error fetching user", Detail: err.Error(), }) return @@ -320,7 +320,7 @@ func (api *API) putUserProfile(rw http.ResponseWriter, r *http.Request) { if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error updating user", + Message: "Internal error updating user", Detail: err.Error(), }) return @@ -329,7 +329,7 @@ func (api *API) putUserProfile(rw http.ResponseWriter, r *http.Request) { organizationIDs, err := userOrganizationIDs(r.Context(), api, user) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching user's organizations", + Message: "Internal error fetching user's organizations", Detail: err.Error(), }) return @@ -362,7 +362,7 @@ func (api *API) putUserStatus(status database.UserStatus) func(rw http.ResponseW if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Detail error updating user's status to %q", status), + Message: fmt.Sprintf("Internal error updating user's status to %q", status), Detail: err.Error(), }) return @@ -371,7 +371,7 @@ func (api *API) putUserStatus(status database.UserStatus) func(rw http.ResponseW organizations, err := userOrganizationIDs(r.Context(), api, user) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching user's organizations", + Message: "Internal error fetching user's organizations", Detail: err.Error(), }) return @@ -417,7 +417,7 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { ok, err := userpassword.Compare(string(user.HashedPassword), params.OldPassword) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error with passwords", + Message: "Internal error with passwords", Detail: err.Error(), }) return @@ -439,7 +439,7 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { hashedPassword, err := userpassword.Hash(params.Password) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error hashing new password", + Message: "Internal error hashing new password", Detail: err.Error(), }) return @@ -450,7 +450,7 @@ func (api *API) putUserPassword(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error updating user's password", + Message: "Internal error updating user's password", Detail: err.Error(), }) return @@ -475,7 +475,7 @@ func (api *API) userRoles(rw http.ResponseWriter, r *http.Request) { memberships, err := api.Database.GetOrganizationMembershipsByUserID(r.Context(), user.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching user's organization memberships", + Message: "Internal error fetching user's organization memberships", Detail: err.Error(), }) return @@ -542,7 +542,7 @@ func (api *API) putUserRoles(rw http.ResponseWriter, r *http.Request) { organizationIDs, err := userOrganizationIDs(r.Context(), api, user) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching user's organizations", + Message: "Internal error fetching user's organizations", Detail: err.Error(), }) return diff --git a/coderd/workspaceagents.go b/coderd/workspaceagents.go index a93e1d51516d5..d8d28870e4003 100644 --- a/coderd/workspaceagents.go +++ b/coderd/workspaceagents.go @@ -34,7 +34,7 @@ func (api *API) workspaceAgent(rw http.ResponseWriter, r *http.Request) { apiAgent, err := convertWorkspaceAgent(workspaceAgent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error reading workspace agent", + Message: "Internal error reading workspace agent", Detail: err.Error(), }) return @@ -53,7 +53,7 @@ func (api *API) workspaceAgentDial(rw http.ResponseWriter, r *http.Request) { apiAgent, err := convertWorkspaceAgent(workspaceAgent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error reading workspace agent", + Message: "Internal error reading workspace agent", Detail: err.Error(), }) return @@ -100,7 +100,7 @@ func (api *API) workspaceAgentMetadata(rw http.ResponseWriter, r *http.Request) apiAgent, err := convertWorkspaceAgent(workspaceAgent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error reading workspace agent", + Message: "Internal error reading workspace agent", Detail: err.Error(), }) return @@ -108,7 +108,7 @@ func (api *API) workspaceAgentMetadata(rw http.ResponseWriter, r *http.Request) resource, err := api.Database.GetWorkspaceResourceByID(r.Context(), workspaceAgent.ResourceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace resources", + Message: "Internal error fetching workspace resources", Detail: err.Error(), }) return @@ -116,7 +116,7 @@ func (api *API) workspaceAgentMetadata(rw http.ResponseWriter, r *http.Request) build, err := api.Database.GetWorkspaceBuildByJobID(r.Context(), resource.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace build", + Message: "Internal error fetching workspace build", Detail: err.Error(), }) return @@ -124,7 +124,7 @@ func (api *API) workspaceAgentMetadata(rw http.ResponseWriter, r *http.Request) workspace, err := api.Database.GetWorkspaceByID(r.Context(), build.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace", + Message: "Internal error fetching workspace", Detail: err.Error(), }) return @@ -132,7 +132,7 @@ func (api *API) workspaceAgentMetadata(rw http.ResponseWriter, r *http.Request) owner, err := api.Database.GetUserByID(r.Context(), workspace.OwnerID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace owner", + Message: "Internal error fetching workspace owner", Detail: err.Error(), }) return @@ -361,7 +361,7 @@ func (api *API) workspaceAgentPTY(rw http.ResponseWriter, r *http.Request) { apiAgent, err := convertWorkspaceAgent(workspaceAgent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error reading workspace agent", + Message: "Internal error reading workspace agent", Detail: err.Error(), }) return diff --git a/coderd/workspacebuilds.go b/coderd/workspacebuilds.go index 5593e1d7f06cc..0442494f6f003 100644 --- a/coderd/workspacebuilds.go +++ b/coderd/workspacebuilds.go @@ -31,7 +31,7 @@ func (api *API) workspaceBuild(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return @@ -68,7 +68,7 @@ func (api *API) workspaceBuilds(rw http.ResponseWriter, r *http.Request) { return err } else if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace build at \"after_id\"", + Message: "Internal error fetching workspace build at \"after_id\"", Detail: err.Error(), }) return err @@ -87,7 +87,7 @@ func (api *API) workspaceBuilds(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace build", + Message: "Internal error fetching workspace build", Detail: err.Error(), }) return err @@ -109,7 +109,7 @@ func (api *API) workspaceBuilds(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner jobs", + Message: "Internal error fetching provisioner jobs", Detail: err.Error(), }) return @@ -154,7 +154,7 @@ func (api *API) workspaceBuildByName(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace build by name", + Message: "Internal error fetching workspace build by name", Detail: err.Error(), }) return @@ -162,7 +162,7 @@ func (api *API) workspaceBuildByName(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return @@ -201,7 +201,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { latestBuild, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), workspace.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error the latest workspace build", + Message: "Internal error the latest workspace build", Detail: err.Error(), }) return @@ -221,7 +221,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching template version", + Message: "Internal error fetching template version", Detail: err.Error(), }) return @@ -229,7 +229,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { templateVersionJob, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return diff --git a/coderd/workspaceresourceauth.go b/coderd/workspaceresourceauth.go index 6a0ee464f8149..3e0c1b1a58c02 100644 --- a/coderd/workspaceresourceauth.go +++ b/coderd/workspaceresourceauth.go @@ -99,7 +99,7 @@ func (api *API) handleAuthInstanceID(rw http.ResponseWriter, r *http.Request, in } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job agent", + Message: "Internal error fetching provisioner job agent", Detail: err.Error(), }) return @@ -107,7 +107,7 @@ func (api *API) handleAuthInstanceID(rw http.ResponseWriter, r *http.Request, in resource, err := api.Database.GetWorkspaceResourceByID(r.Context(), agent.ResourceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job resource", + Message: "Internal error fetching provisioner job resource", Detail: err.Error(), }) return @@ -115,7 +115,7 @@ func (api *API) handleAuthInstanceID(rw http.ResponseWriter, r *http.Request, in job, err := api.Database.GetProvisionerJobByID(r.Context(), resource.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return @@ -130,7 +130,7 @@ func (api *API) handleAuthInstanceID(rw http.ResponseWriter, r *http.Request, in err = json.Unmarshal(job.Input, &jobData) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error extracting job data", + Message: "Internal error extracting job data", Detail: err.Error(), }) return @@ -138,7 +138,7 @@ func (api *API) handleAuthInstanceID(rw http.ResponseWriter, r *http.Request, in resourceHistory, err := api.Database.GetWorkspaceBuildByID(r.Context(), jobData.WorkspaceBuildID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace build", + Message: "Internal error fetching workspace build", Detail: err.Error(), }) return @@ -149,7 +149,7 @@ func (api *API) handleAuthInstanceID(rw http.ResponseWriter, r *http.Request, in latestHistory, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), resourceHistory.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error the latest workspace build", + Message: "Internal error the latest workspace build", Detail: err.Error(), }) return diff --git a/coderd/workspaceresources.go b/coderd/workspaceresources.go index 10b2ca998b38b..c367d89d596c7 100644 --- a/coderd/workspaceresources.go +++ b/coderd/workspaceresources.go @@ -24,7 +24,7 @@ func (api *API) workspaceResource(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return @@ -41,7 +41,7 @@ func (api *API) workspaceResource(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job agents", + Message: "Internal error fetching provisioner job agents", Detail: err.Error(), }) return @@ -51,7 +51,7 @@ func (api *API) workspaceResource(rw http.ResponseWriter, r *http.Request) { convertedAgent, err := convertWorkspaceAgent(agent, api.AgentConnectionUpdateFrequency) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error reading workspace agent", + Message: "Internal error reading workspace agent", Detail: err.Error(), }) return diff --git a/coderd/workspaces.go b/coderd/workspaces.go index cc9bcb6376125..b778ff894d373 100644 --- a/coderd/workspaces.go +++ b/coderd/workspaces.go @@ -70,7 +70,7 @@ func (api *API) workspace(rw http.ResponseWriter, r *http.Request) { build, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), workspace.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace build", + Message: "Internal error fetching workspace build", Detail: err.Error(), }) return @@ -96,7 +96,7 @@ func (api *API) workspace(rw http.ResponseWriter, r *http.Request) { err = group.Wait() if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching resource", + Message: "Internal error fetching resource", Detail: err.Error(), }) return @@ -116,7 +116,7 @@ func (api *API) workspacesByOrganization(rw http.ResponseWriter, r *http.Request } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspaces", + Message: "Internal error fetching workspaces", Detail: err.Error(), }) return @@ -128,7 +128,7 @@ func (api *API) workspacesByOrganization(rw http.ResponseWriter, r *http.Request apiWorkspaces, err := convertWorkspaces(r.Context(), api.Database, workspaces) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error reading workspaces", + Message: "Internal error reading workspaces", Detail: err.Error(), }) return @@ -189,7 +189,7 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { workspaces, err := api.Database.GetWorkspacesWithFilter(r.Context(), filter) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspaces", + Message: "Internal error fetching workspaces", Detail: err.Error(), }) return @@ -201,7 +201,7 @@ func (api *API) workspaces(rw http.ResponseWriter, r *http.Request) { apiWorkspaces, err := convertWorkspaces(r.Context(), api.Database, workspaces) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error reading workspaces", + Message: "Internal error reading workspaces", Detail: err.Error(), }) return @@ -220,7 +220,7 @@ func (api *API) workspacesByOwner(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspaces", + Message: "Internal error fetching workspaces", Detail: err.Error(), }) return @@ -232,7 +232,7 @@ func (api *API) workspacesByOwner(rw http.ResponseWriter, r *http.Request) { apiWorkspaces, err := convertWorkspaces(r.Context(), api.Database, workspaces) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error reading workspaces", + Message: "Internal error reading workspaces", Detail: err.Error(), }) return @@ -256,7 +256,7 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request) } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace by name", + Message: "Internal error fetching workspace by name", Detail: err.Error(), }) return @@ -276,7 +276,7 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request) build, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), workspace.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching workspace build", + Message: "Internal error fetching workspace build", Detail: err.Error(), }) return @@ -284,7 +284,7 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request) job, err := api.Database.GetProvisionerJobByID(r.Context(), build.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return @@ -292,7 +292,7 @@ func (api *API) workspaceByOwnerAndName(rw http.ResponseWriter, r *http.Request) template, err := api.Database.GetTemplateByID(r.Context(), workspace.TemplateID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching template", + Message: "Internal error fetching template", Detail: err.Error(), }) return @@ -328,7 +328,7 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching template", + Message: "Internal error fetching template", Detail: err.Error(), }) return @@ -352,7 +352,7 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching organization member", + Message: "Internal error fetching organization member", Detail: err.Error(), }) return @@ -413,7 +413,7 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req } if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Detail error fetching workspace by name %q", createWorkspace.Name), + Message: fmt.Sprintf("Internal error fetching workspace by name %q", createWorkspace.Name), Detail: err.Error(), }) return @@ -422,7 +422,7 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req templateVersion, err := api.Database.GetTemplateVersionByID(r.Context(), template.ActiveVersionID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching template version", + Message: "Internal error fetching template version", Detail: err.Error(), }) return From 4a5d03aa61de4ea379ac79c1a5037f09a2a635de Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 16:00:04 -0500 Subject: [PATCH 17/21] Fix accidental 'detail' --- coderd/httpapi/httpapi.go | 4 ++-- coderd/templateversions.go | 26 +++++++++++++------------- coderd/users.go | 12 ++++++------ coderd/workspacebuilds.go | 14 +++++++------- coderd/workspaces.go | 16 ++++++++-------- 5 files changed, 36 insertions(+), 36 deletions(-) diff --git a/coderd/httpapi/httpapi.go b/coderd/httpapi/httpapi.go index 06c8efa5a5900..db73b0251343e 100644 --- a/coderd/httpapi/httpapi.go +++ b/coderd/httpapi/httpapi.go @@ -107,8 +107,8 @@ func Read(rw http.ResponseWriter, r *http.Request, value interface{}) bool { err := json.NewDecoder(r.Body).Decode(value) if err != nil { Write(rw, http.StatusBadRequest, Response{ - Message: "Request body must be valid JSON", - Internal: err.Error(), + Message: "Request body must be valid JSON", + Detail: err.Error(), }) return false } diff --git a/coderd/templateversions.go b/coderd/templateversions.go index 03c7850623fc4..7b8ad16c3c93b 100644 --- a/coderd/templateversions.go +++ b/coderd/templateversions.go @@ -356,7 +356,7 @@ func (api *API) fetchTemplateVersionDryRunJob(rw http.ResponseWriter, r *http.Re } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return database.ProvisionerJob{}, false @@ -376,7 +376,7 @@ func (api *API) fetchTemplateVersionDryRunJob(rw http.ResponseWriter, r *http.Re err = json.Unmarshal(job.Input, &input) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error unmarshaling job metadata", + Message: "Internal error unmarshaling job metadata", Detail: err.Error(), }) return database.ProvisionerJob{}, false @@ -414,7 +414,7 @@ func (api *API) templateVersionsByTemplate(rw http.ResponseWriter, r *http.Reque return err } else if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching template version at after_id", + Message: "Internal error fetching template version at after_id", Detail: err.Error(), }) return err @@ -433,7 +433,7 @@ func (api *API) templateVersionsByTemplate(rw http.ResponseWriter, r *http.Reque } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching template versions", + Message: "Internal error fetching template versions", Detail: err.Error(), }) return err @@ -446,7 +446,7 @@ func (api *API) templateVersionsByTemplate(rw http.ResponseWriter, r *http.Reque jobs, err := store.GetProvisionerJobsByIDs(r.Context(), jobIDs) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return err @@ -498,7 +498,7 @@ func (api *API) templateVersionByName(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching template version", + Message: "Internal error fetching template version", Detail: err.Error(), }) return @@ -506,7 +506,7 @@ func (api *API) templateVersionByName(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return @@ -534,7 +534,7 @@ func (api *API) patchActiveTemplateVersion(rw http.ResponseWriter, r *http.Reque } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching template version", + Message: "Internal error fetching template version", Detail: err.Error(), }) return @@ -551,7 +551,7 @@ func (api *API) patchActiveTemplateVersion(rw http.ResponseWriter, r *http.Reque }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error updating active template version", + Message: "Internal error updating active template version", Detail: err.Error(), }) return @@ -580,7 +580,7 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching template", + Message: "Internal error fetching template", Detail: err.Error(), }) return @@ -596,7 +596,7 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching file", + Message: "Internal error fetching file", Detail: err.Error(), }) return @@ -695,7 +695,7 @@ func (api *API) templateVersionResources(rw http.ResponseWriter, r *http.Request job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return @@ -716,7 +716,7 @@ func (api *API) templateVersionLogs(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return diff --git a/coderd/users.go b/coderd/users.go index 99f3ab0852b69..89be6702b77fa 100644 --- a/coderd/users.go +++ b/coderd/users.go @@ -583,7 +583,7 @@ func (api *API) organizationsByUser(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching user's organizations", + Message: "Internal error fetching user's organizations", Detail: err.Error(), }) return @@ -636,7 +636,7 @@ func (api *API) postLogin(rw http.ResponseWriter, r *http.Request) { }) if err != nil && !xerrors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error", + Message: "Internal error", }) return } @@ -645,7 +645,7 @@ func (api *API) postLogin(rw http.ResponseWriter, r *http.Request) { equal, err := userpassword.Compare(string(user.HashedPassword), loginWithPassword.Password) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error", + Message: "Internal error", }) } if !equal { @@ -719,7 +719,7 @@ func (api *API) postLogout(rw http.ResponseWriter, r *http.Request) { err := api.Database.DeleteAPIKeyByID(r.Context(), apiKey.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error deleting api key", + Message: "Internal error deleting api key", Detail: err.Error(), }) return @@ -749,7 +749,7 @@ func (api *API) createAPIKey(rw http.ResponseWriter, r *http.Request, params dat keyID, keySecret, err := generateAPIKeyIDSecret() if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error generating api key", + Message: "Internal error generating api key", Detail: err.Error(), }) return "", false @@ -782,7 +782,7 @@ func (api *API) createAPIKey(rw http.ResponseWriter, r *http.Request, params dat }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error inserting api key", + Message: "Internal error inserting api key", Detail: err.Error(), }) return "", false diff --git a/coderd/workspacebuilds.go b/coderd/workspacebuilds.go index 0442494f6f003..37195077d0493 100644 --- a/coderd/workspacebuilds.go +++ b/coderd/workspacebuilds.go @@ -256,7 +256,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { template, err := api.Database.GetTemplateByID(r.Context(), templateVersion.TemplateID.UUID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching template job", + Message: "Internal error fetching template job", Detail: err.Error(), }) return @@ -277,7 +277,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { priorBuildNum = priorHistory.BuildNumber } else if !errors.Is(err, sql.ErrNoRows) { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching prior workspace build", + Message: "Internal error fetching prior workspace build", Detail: err.Error(), }) return @@ -336,7 +336,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error inserting workspace build", + Message: "Internal error inserting workspace build", Detail: err.Error(), }) return @@ -364,7 +364,7 @@ func (api *API) patchCancelWorkspaceBuild(rw http.ResponseWriter, r *http.Reques job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return @@ -390,7 +390,7 @@ func (api *API) patchCancelWorkspaceBuild(rw http.ResponseWriter, r *http.Reques }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error updating provisioner job", + Message: "Internal error updating provisioner job", Detail: err.Error(), }) return @@ -418,7 +418,7 @@ func (api *API) workspaceBuildResources(rw http.ResponseWriter, r *http.Request) job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return @@ -444,7 +444,7 @@ func (api *API) workspaceBuildLogs(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetProvisionerJobByID(r.Context(), workspaceBuild.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching provisioner job", + Message: "Internal error fetching provisioner job", Detail: err.Error(), }) return diff --git a/coderd/workspaces.go b/coderd/workspaces.go index b778ff894d373..3c7abfbd7f69e 100644 --- a/coderd/workspaces.go +++ b/coderd/workspaces.go @@ -430,7 +430,7 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req templateVersionJob, err := api.Database.GetProvisionerJobByID(r.Context(), templateVersion.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching template version job", + Message: "Internal error fetching template version job", Detail: err.Error(), }) return @@ -532,7 +532,7 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error creating workspace", + Message: "Internal error creating workspace", Detail: err.Error(), }) return @@ -540,7 +540,7 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req user, err := api.Database.GetUserByID(r.Context(), apiKey.UserID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error fetching user", + Message: "Internal error fetching user", Detail: err.Error(), }) return @@ -576,7 +576,7 @@ func (api *API) putWorkspaceAutostart(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error updating workspace autostart schedule", + Message: "Internal error updating workspace autostart schedule", Detail: err.Error(), }) return @@ -616,7 +616,7 @@ func (api *API) putWorkspaceTTL(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Detail error updating workspace TTL", + Message: "Internal error updating workspace TTL", Detail: err.Error(), }) return @@ -729,7 +729,7 @@ func (api *API) watchWorkspace(rw http.ResponseWriter, r *http.Request) { workspace, err := api.Database.GetWorkspaceByID(r.Context(), workspace.ID) if err != nil { _ = wsjson.Write(ctx, c, httpapi.Response{ - Message: "Detail error fetching workspace", + Message: "Internal error fetching workspace", Detail: err.Error(), }) return @@ -737,7 +737,7 @@ func (api *API) watchWorkspace(rw http.ResponseWriter, r *http.Request) { build, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), workspace.ID) if err != nil { _ = wsjson.Write(ctx, c, httpapi.Response{ - Message: "Detail error fetching workspace build", + Message: "Internal error fetching workspace build", Detail: err.Error(), }) return @@ -763,7 +763,7 @@ func (api *API) watchWorkspace(rw http.ResponseWriter, r *http.Request) { err = group.Wait() if err != nil { _ = wsjson.Write(ctx, c, httpapi.Response{ - Message: "Detail error fetching resource", + Message: "Internal error fetching resource", Detail: err.Error(), }) return From 819f2e14152f485ae4c5ad179fc077345f27274d Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 16:14:01 -0500 Subject: [PATCH 18/21] PR comments addressed Mainly capitlization --- coderd/gitsshkey.go | 32 ++++++++++++++++---------------- coderd/httpmw/apikey.go | 12 ++++++------ coderd/httpmw/httpmw.go | 4 ++-- coderd/httpmw/oauth2.go | 2 +- coderd/members.go | 2 +- coderd/pagination.go | 3 --- coderd/parameters_test.go | 5 +++-- coderd/provisionerjobs.go | 2 -- coderd/userauth.go | 6 +++--- coderd/users.go | 8 ++++---- coderd/workspaceagents.go | 5 ++--- coderd/workspacebuilds.go | 2 +- coderd/workspaceresourceauth.go | 10 +++++----- 13 files changed, 44 insertions(+), 49 deletions(-) diff --git a/coderd/gitsshkey.go b/coderd/gitsshkey.go index 1a4f7e22f7a18..4eee07849c473 100644 --- a/coderd/gitsshkey.go +++ b/coderd/gitsshkey.go @@ -21,8 +21,8 @@ func (api *API) regenerateGitSSHKey(rw http.ResponseWriter, r *http.Request) { privateKey, publicKey, err := gitsshkey.Generate(api.SSHKeygenAlgorithm) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error generating a new SSH keypair", - Internal: err.Error(), + Message: "Internal error generating a new SSH keypair", + Detail: err.Error(), }) return } @@ -35,8 +35,8 @@ func (api *API) regenerateGitSSHKey(rw http.ResponseWriter, r *http.Request) { }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error updating user's git SSH key", - Internal: err.Error(), + Message: "Internal error updating user's git SSH key", + Detail: err.Error(), }) return } @@ -44,8 +44,8 @@ func (api *API) regenerateGitSSHKey(rw http.ResponseWriter, r *http.Request) { newKey, err := api.Database.GetGitSSHKey(r.Context(), user.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's git SSH key", - Internal: err.Error(), + Message: "Internal error fetching user's git SSH key", + Detail: err.Error(), }) return } @@ -69,8 +69,8 @@ func (api *API) gitSSHKey(rw http.ResponseWriter, r *http.Request) { gitSSHKey, err := api.Database.GetGitSSHKey(r.Context(), user.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching user's SSH key", - Internal: err.Error(), + Message: "Internal error fetching user's SSH key", + Detail: err.Error(), }) return } @@ -89,8 +89,8 @@ func (api *API) agentGitSSHKey(rw http.ResponseWriter, r *http.Request) { resource, err := api.Database.GetWorkspaceResourceByID(r.Context(), agent.ResourceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace resource", - Internal: err.Error(), + Message: "Internal error fetching workspace resource", + Detail: err.Error(), }) return } @@ -98,8 +98,8 @@ func (api *API) agentGitSSHKey(rw http.ResponseWriter, r *http.Request) { job, err := api.Database.GetWorkspaceBuildByJobID(r.Context(), resource.JobID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace build", - Internal: err.Error(), + Message: "Internal error fetching workspace build", + Detail: err.Error(), }) return } @@ -107,8 +107,8 @@ func (api *API) agentGitSSHKey(rw http.ResponseWriter, r *http.Request) { workspace, err := api.Database.GetWorkspaceByID(r.Context(), job.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching workspace", - Internal: err.Error(), + Message: "Internal error fetching workspace", + Detail: err.Error(), }) return } @@ -116,8 +116,8 @@ func (api *API) agentGitSSHKey(rw http.ResponseWriter, r *http.Request) { gitSSHKey, err := api.Database.GetGitSSHKey(r.Context(), workspace.OwnerID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching git SSH key", - Internal: err.Error(), + Message: "Internal error fetching git SSH key", + Detail: err.Error(), }) return } diff --git a/coderd/httpmw/apikey.go b/coderd/httpmw/apikey.go index ca36a8a6947a0..583daff59fd23 100644 --- a/coderd/httpmw/apikey.go +++ b/coderd/httpmw/apikey.go @@ -73,7 +73,7 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h // APIKeys are formatted: ID-SECRET if len(parts) != 2 { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("Invalid %q cookie api key format", SessionTokenKey), + Message: fmt.Sprintf("Invalid %q cookie API key format", SessionTokenKey), }) return } @@ -82,13 +82,13 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h // Ensuring key lengths are valid. if len(keyID) != 10 { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("Invalid %q cookie api key id", SessionTokenKey), + Message: fmt.Sprintf("Invalid %q cookie API key id", SessionTokenKey), }) return } if len(keySecret) != 22 { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("Invalid %q cookie api key secret", SessionTokenKey), + Message: fmt.Sprintf("Invalid %q cookie API key secret", SessionTokenKey), }) return } @@ -101,7 +101,7 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h return } httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching api key by id", + Message: "Internal error fetching API key by id", Detail: err.Error(), }) return @@ -140,7 +140,7 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h }).Token() if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "Could not refresh expired oauth token", + Message: "Could not refresh expired Oauth token", Detail: err.Error(), }) return @@ -204,7 +204,7 @@ func ExtractAPIKey(db database.Store, oauth *OAuth2Configs) func(http.Handler) h if roles.Status != database.UserStatusActive { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: fmt.Sprintf("User is not active (status = %q), contact an admin to reactivate your account", roles.Status), + Message: fmt.Sprintf("User is not active (status = %q). Contact an admin to reactivate your account.", roles.Status), }) return } diff --git a/coderd/httpmw/httpmw.go b/coderd/httpmw/httpmw.go index d183a1602160f..ae085138f24ca 100644 --- a/coderd/httpmw/httpmw.go +++ b/coderd/httpmw/httpmw.go @@ -15,9 +15,9 @@ func parseUUID(rw http.ResponseWriter, r *http.Request, param string) (uuid.UUID rawID := chi.URLParam(r, param) if rawID == "" { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Missing uuid in url", + Message: "Missing UUID in URL", // Url params mean nothing to a user - Detail: fmt.Sprintf("%q url param missing", param), + Detail: fmt.Sprintf("%q URL param missing", param), }) return uuid.UUID{}, false } diff --git a/coderd/httpmw/oauth2.go b/coderd/httpmw/oauth2.go index e54a78ed1fe71..0d87aba6201cb 100644 --- a/coderd/httpmw/oauth2.go +++ b/coderd/httpmw/oauth2.go @@ -120,7 +120,7 @@ func ExtractOAuth2(config OAuth2Config) func(http.Handler) http.Handler { oauthToken, err := config.Exchange(r.Context(), code) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error exchanging oauth code", + Message: "Internal error exchanging Oauth code", Detail: err.Error(), }) return diff --git a/coderd/members.go b/coderd/members.go index f89b048b4d509..eab402b71148d 100644 --- a/coderd/members.go +++ b/coderd/members.go @@ -76,7 +76,7 @@ func (api *API) updateOrganizationMemberRoles(ctx context.Context, args database roleOrg, err := uuid.Parse(orgID) if err != nil { - return database.OrganizationMember{}, xerrors.Errorf("Role must have proper uuids for organization, %q does not", r) + return database.OrganizationMember{}, xerrors.Errorf("Role must have proper UUIDs for organization, %q does not", r) } if roleOrg != args.OrgID { diff --git a/coderd/pagination.go b/coderd/pagination.go index 553d1c09cf89e..7c8988379601c 100644 --- a/coderd/pagination.go +++ b/coderd/pagination.go @@ -25,7 +25,6 @@ func parsePagination(w http.ResponseWriter, r *http.Request) (p codersdk.Paginat if err != nil { httpapi.Write(w, http.StatusBadRequest, httpapi.Response{ Message: "Query param 'after_id' must be a valid UUID", - Detail: err.Error(), Validations: []httpapi.Error{ {Field: "after_id", Detail: err.Error()}, }, @@ -38,7 +37,6 @@ func parsePagination(w http.ResponseWriter, r *http.Request) (p codersdk.Paginat if err != nil { httpapi.Write(w, http.StatusBadRequest, httpapi.Response{ Message: "Query param 'limit' must be a valid integer", - Detail: err.Error(), Validations: []httpapi.Error{ {Field: "limit", Detail: err.Error()}, }, @@ -51,7 +49,6 @@ func parsePagination(w http.ResponseWriter, r *http.Request) (p codersdk.Paginat if err != nil { httpapi.Write(w, http.StatusBadRequest, httpapi.Response{ Message: "Query param 'offset' must be a valid integer", - Detail: err.Error(), Validations: []httpapi.Error{ {Field: "offset", Detail: err.Error()}, }, diff --git a/coderd/parameters_test.go b/coderd/parameters_test.go index eb2857f2cb150..b0e519b938847 100644 --- a/coderd/parameters_test.go +++ b/coderd/parameters_test.go @@ -2,11 +2,12 @@ package coderd_test import ( "context" - "github.com/coder/coder/provisioner/echo" - "github.com/coder/coder/provisionersdk/proto" "net/http" "testing" + "github.com/coder/coder/provisioner/echo" + "github.com/coder/coder/provisionersdk/proto" + "github.com/stretchr/testify/require" "github.com/coder/coder/coderd/coderdtest" diff --git a/coderd/provisionerjobs.go b/coderd/provisionerjobs.go index 861843f8ce2bd..52031eaff4bc1 100644 --- a/coderd/provisionerjobs.go +++ b/coderd/provisionerjobs.go @@ -44,7 +44,6 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: "Query param \"after\" must be an integer", - Detail: err.Error(), Validations: []httpapi.Error{ {Field: "after", Detail: "Must be an integer"}, }, @@ -64,7 +63,6 @@ func (api *API) provisionerJobLogs(rw http.ResponseWriter, r *http.Request, job if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: "Query param \"before\" must be an integer", - Detail: err.Error(), Validations: []httpapi.Error{ {Field: "before", Detail: "Must be an integer"}, }, diff --git a/coderd/userauth.go b/coderd/userauth.go index a2b1c0b3ace1c..329994980088e 100644 --- a/coderd/userauth.go +++ b/coderd/userauth.go @@ -42,7 +42,7 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { memberships, err := api.GithubOAuth2Config.ListOrganizationMemberships(r.Context(), oauthClient) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching authenticated github user organizations", + Message: "Internal error fetching authenticated Github user organizations", Detail: err.Error(), }) return @@ -67,7 +67,7 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { emails, err := api.GithubOAuth2Config.ListEmails(r.Context(), oauthClient) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching personal github user", + Message: "Internal error fetching personal Github user", Detail: err.Error(), }) return @@ -122,7 +122,7 @@ func (api *API) userOAuth2Github(rw http.ResponseWriter, r *http.Request) { ghUser, err := api.GithubOAuth2Config.AuthenticatedUser(r.Context(), oauthClient) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error fetching authenticated github user", + Message: "Internal error fetching authenticated Github user", Detail: err.Error(), }) return diff --git a/coderd/users.go b/coderd/users.go index 89be6702b77fa..cd0998cfad707 100644 --- a/coderd/users.go +++ b/coderd/users.go @@ -660,7 +660,7 @@ func (api *API) postLogin(rw http.ResponseWriter, r *http.Request) { // If the user logged into a suspended account, reject the login request. if user.Status != database.UserStatusActive { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "You are suspended, contact an admin to reactivate your account.", + Message: "Your account is suspended. Contact an admin to reactivate your account.", }) return } @@ -719,7 +719,7 @@ func (api *API) postLogout(rw http.ResponseWriter, r *http.Request) { err := api.Database.DeleteAPIKeyByID(r.Context(), apiKey.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error deleting api key", + Message: "Internal error deleting API key", Detail: err.Error(), }) return @@ -749,7 +749,7 @@ func (api *API) createAPIKey(rw http.ResponseWriter, r *http.Request, params dat keyID, keySecret, err := generateAPIKeyIDSecret() if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error generating api key", + Message: "Internal error generating API key", Detail: err.Error(), }) return "", false @@ -782,7 +782,7 @@ func (api *API) createAPIKey(rw http.ResponseWriter, r *http.Request, params dat }) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error inserting api key", + Message: "Internal error inserting API key", Detail: err.Error(), }) return "", false diff --git a/coderd/workspaceagents.go b/coderd/workspaceagents.go index d8d28870e4003..6e51c7d6260b7 100644 --- a/coderd/workspaceagents.go +++ b/coderd/workspaceagents.go @@ -321,7 +321,7 @@ func (api *API) workspaceAgentTurn(rw http.ResponseWriter, r *http.Request) { remoteAddress.Port, err = strconv.Atoi(port) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: fmt.Sprintf("Remote address %q has no parsable port, must be an integer.", r.RemoteAddr), + Message: fmt.Sprintf("Port for remote address %q must be an integer.", r.RemoteAddr), Detail: err.Error(), }) return @@ -368,7 +368,7 @@ func (api *API) workspaceAgentPTY(rw http.ResponseWriter, r *http.Request) { } if apiAgent.Status != codersdk.WorkspaceAgentConnected { httpapi.Write(rw, http.StatusPreconditionRequired, httpapi.Response{ - Message: fmt.Sprintf("Agent state it %q, it must be in the %q state.", apiAgent.Status, codersdk.WorkspaceAgentConnected), + Message: fmt.Sprintf("Agent state is %q, it must be in the %q state.", apiAgent.Status, codersdk.WorkspaceAgentConnected), }) return } @@ -377,7 +377,6 @@ func (api *API) workspaceAgentPTY(rw http.ResponseWriter, r *http.Request) { if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ Message: "Query param 'reconnect' must be a valid UUID", - Detail: err.Error(), Validations: []httpapi.Error{ {Field: "reconnect", Detail: "invalid UUID"}, }, diff --git a/coderd/workspacebuilds.go b/coderd/workspacebuilds.go index 37195077d0493..8877af73ac631 100644 --- a/coderd/workspacebuilds.go +++ b/coderd/workspacebuilds.go @@ -201,7 +201,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) { latestBuild, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), workspace.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error the latest workspace build", + Message: "Internal error fetching the latest workspace build", Detail: err.Error(), }) return diff --git a/coderd/workspaceresourceauth.go b/coderd/workspaceresourceauth.go index 3e0c1b1a58c02..bff44d359bdc2 100644 --- a/coderd/workspaceresourceauth.go +++ b/coderd/workspaceresourceauth.go @@ -26,7 +26,7 @@ func (api *API) postWorkspaceAuthAzureInstanceIdentity(rw http.ResponseWriter, r instanceID, err := azureidentity.Validate(r.Context(), req.Signature, api.AzureCertificates) if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "Invalid azure identity", + Message: "Invalid Azure identity", Detail: err.Error(), }) return @@ -45,7 +45,7 @@ func (api *API) postWorkspaceAuthAWSInstanceIdentity(rw http.ResponseWriter, r * identity, err := awsidentity.Validate(req.Signature, req.Document, api.AWSCertificates) if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "Invalid aws identity", + Message: "Invalid AWS identity", Detail: err.Error(), }) return @@ -66,7 +66,7 @@ func (api *API) postWorkspaceAuthGoogleInstanceIdentity(rw http.ResponseWriter, payload, err := api.GoogleTokenValidator.Validate(r.Context(), req.JSONWebToken, "") if err != nil { httpapi.Write(rw, http.StatusUnauthorized, httpapi.Response{ - Message: "Invalid gcp identity", + Message: "Invalid GCP identity", Detail: err.Error(), }) return @@ -81,7 +81,7 @@ func (api *API) postWorkspaceAuthGoogleInstanceIdentity(rw http.ResponseWriter, err = mapstructure.Decode(payload.Claims, &claims) if err != nil { httpapi.Write(rw, http.StatusBadRequest, httpapi.Response{ - Message: "Error decoding jwt claims", + Message: "Error decoding JWT claims", Detail: err.Error(), }) return @@ -149,7 +149,7 @@ func (api *API) handleAuthInstanceID(rw http.ResponseWriter, r *http.Request, in latestHistory, err := api.Database.GetLatestWorkspaceBuildByWorkspaceID(r.Context(), resourceHistory.WorkspaceID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: "Internal error the latest workspace build", + Message: "Internal error fetching the latest workspace build", Detail: err.Error(), }) return From 1116f944f7008607a998520c68f978cd0fb3cda6 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 16:16:28 -0500 Subject: [PATCH 19/21] Linting changes --- coderd/files.go | 2 +- coderd/parameters.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/coderd/files.go b/coderd/files.go index c919b4f477ddd..5c849d631366c 100644 --- a/coderd/files.go +++ b/coderd/files.go @@ -91,7 +91,7 @@ func (api *API) fileByHash(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Internal error fetching file"), + Message: "Internal error fetching file", Detail: err.Error(), }) return diff --git a/coderd/parameters.go b/coderd/parameters.go index e05f5e40abe9f..ee32048d95cac 100644 --- a/coderd/parameters.go +++ b/coderd/parameters.go @@ -140,7 +140,7 @@ func (api *API) deleteParameter(rw http.ResponseWriter, r *http.Request) { } if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Internal error fetching parameter"), + Message: "Internal error fetching parameter", Detail: err.Error(), }) return @@ -148,7 +148,7 @@ func (api *API) deleteParameter(rw http.ResponseWriter, r *http.Request) { err = api.Database.DeleteParameterValueByID(r.Context(), parameterValue.ID) if err != nil { httpapi.Write(rw, http.StatusInternalServerError, httpapi.Response{ - Message: fmt.Sprintf("Internal error deleting parameter"), + Message: "Internal error deleting parameter", Detail: err.Error(), }) return From 102a01fe8e1e9f1373c6302f11063e5e9601fe55 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 16:31:34 -0500 Subject: [PATCH 20/21] Fix test error asserts --- cli/autostart.go | 2 +- cli/autostart_test.go | 4 ++-- cli/ttl_test.go | 4 ++-- coderd/roles_test.go | 2 +- coderd/users_test.go | 2 +- coderd/workspaces_test.go | 10 +++++----- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cli/autostart.go b/cli/autostart.go index 8f31520784f2b..2735b5a42d0cb 100644 --- a/cli/autostart.go +++ b/cli/autostart.go @@ -55,7 +55,7 @@ func autostartShow() *cobra.Command { validSchedule, err := schedule.Weekly(*workspace.AutostartSchedule) if err != nil { // This should never happen. - _, _ = fmt.Fprintf(cmd.OutOrStdout(), "invalid autostart schedule %q for workspace %s: %s\n", *workspace.AutostartSchedule, workspace.Name, err.Error()) + _, _ = fmt.Fprintf(cmd.OutOrStdout(), "Invalid autostart schedule %q for workspace %s: %s\n", *workspace.AutostartSchedule, workspace.Name, err.Error()) return nil } diff --git a/cli/autostart_test.go b/cli/autostart_test.go index dd17105f3f9a9..accfd5c0d45ff 100644 --- a/cli/autostart_test.go +++ b/cli/autostart_test.go @@ -108,7 +108,7 @@ func TestAutostart(t *testing.T) { clitest.SetupConfig(t, client, root) err := cmd.Execute() - require.ErrorContains(t, err, "status code 403: forbidden", "unexpected error") + require.ErrorContains(t, err, "status code 403: Forbidden", "unexpected error") }) t.Run("Disable_NotFound", func(t *testing.T) { @@ -125,7 +125,7 @@ func TestAutostart(t *testing.T) { clitest.SetupConfig(t, client, root) err := cmd.Execute() - require.ErrorContains(t, err, "status code 403: forbidden", "unexpected error") + require.ErrorContains(t, err, "status code 403: Forbidden", "unexpected error") }) t.Run("Enable_DefaultSchedule", func(t *testing.T) { diff --git a/cli/ttl_test.go b/cli/ttl_test.go index 7efe03ce27b7d..b128078e23bb8 100644 --- a/cli/ttl_test.go +++ b/cli/ttl_test.go @@ -149,7 +149,7 @@ func TestTTL(t *testing.T) { clitest.SetupConfig(t, client, root) err := cmd.Execute() - require.ErrorContains(t, err, "status code 403: forbidden", "unexpected error") + require.ErrorContains(t, err, "status code 403: Forbidden", "unexpected error") }) t.Run("Unset_NotFound", func(t *testing.T) { @@ -166,6 +166,6 @@ func TestTTL(t *testing.T) { clitest.SetupConfig(t, client, root) err := cmd.Execute() - require.ErrorContains(t, err, "status code 403: forbidden", "unexpected error") + require.ErrorContains(t, err, "status code 403: Forbidden", "unexpected error") }) } diff --git a/coderd/roles_test.go b/coderd/roles_test.go index baa956863ab03..a30daa46ba7a7 100644 --- a/coderd/roles_test.go +++ b/coderd/roles_test.go @@ -112,7 +112,7 @@ func TestListRoles(t *testing.T) { }) require.NoError(t, err, "create org") - const forbidden = "forbidden" + const forbidden = "Forbidden" siteRoles := convertRoles(rbac.RoleAdmin(), "auditor") orgRoles := convertRoles(rbac.RoleOrgAdmin(admin.OrganizationID)) diff --git a/coderd/users_test.go b/coderd/users_test.go index 5da48ccf1a55a..dffc535a24044 100644 --- a/coderd/users_test.go +++ b/coderd/users_test.go @@ -103,7 +103,7 @@ func TestPostLogin(t *testing.T) { var apiErr *codersdk.Error require.ErrorAs(t, err, &apiErr) require.Equal(t, http.StatusUnauthorized, apiErr.StatusCode()) - require.Contains(t, apiErr.Message, "contact an admin") + require.Contains(t, apiErr.Message, "Contact an admin") // Test a new session _, err = client.LoginWithPassword(context.Background(), codersdk.LoginWithPasswordRequest{ diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index 377ef6ed1ab74..9692ff8911fc7 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -441,17 +441,17 @@ func TestWorkspaceUpdateAutostart(t *testing.T) { { name: "invalid location", schedule: ptr.Ref("CRON_TZ=Imaginary/Place 30 9 * * 1-5"), - expectedError: "status code 500: invalid autostart schedule: parse schedule: provided bad location Imaginary/Place: unknown time zone Imaginary/Place", + expectedError: "status code 500: Invalid autostart schedule\n\tError: parse schedule: provided bad location Imaginary/Place: unknown time zone Imaginary/Place", }, { name: "invalid schedule", schedule: ptr.Ref("asdf asdf asdf "), - expectedError: `status code 500: invalid autostart schedule: validate weekly schedule: expected schedule to consist of 5 fields with an optional CRON_TZ= prefix`, + expectedError: "status code 500: Invalid autostart schedule\n\tError: validate weekly schedule: expected schedule to consist of 5 fields with an optional CRON_TZ= prefix", }, { name: "only 3 values", schedule: ptr.Ref("CRON_TZ=Europe/Dublin 30 9 *"), - expectedError: `status code 500: invalid autostart schedule: validate weekly schedule: expected schedule to consist of 5 fields with an optional CRON_TZ= prefix`, + expectedError: "status code 500: Invalid autostart schedule\n\tError: validate weekly schedule: expected schedule to consist of 5 fields with an optional CRON_TZ= prefix", }, } @@ -480,7 +480,7 @@ func TestWorkspaceUpdateAutostart(t *testing.T) { }) if testCase.expectedError != "" { - require.ErrorContains(t, err, testCase.expectedError, "unexpected error when setting workspace autostart schedule") + require.ErrorContains(t, err, testCase.expectedError, "Invalid autostart schedule") return } @@ -521,7 +521,7 @@ func TestWorkspaceUpdateAutostart(t *testing.T) { require.IsType(t, err, &codersdk.Error{}, "expected codersdk.Error") coderSDKErr, _ := err.(*codersdk.Error) //nolint:errorlint require.Equal(t, coderSDKErr.StatusCode(), 404, "expected status code 404") - require.Equal(t, fmt.Sprintf("workspace %q does not exist", wsid), coderSDKErr.Message, "unexpected response code") + require.Equal(t, fmt.Sprintf("Workspace %q does not exist", wsid), coderSDKErr.Message, "unexpected response code") }) } From af169f04a392af7e18ed25e413f90820b555e115 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 3 Jun 2022 16:33:09 -0500 Subject: [PATCH 21/21] Fix test error asserts --- coderd/workspaces_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index 9692ff8911fc7..c7b0e28f3b391 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -613,7 +613,7 @@ func TestWorkspaceUpdateTTL(t *testing.T) { require.IsType(t, err, &codersdk.Error{}, "expected codersdk.Error") coderSDKErr, _ := err.(*codersdk.Error) //nolint:errorlint require.Equal(t, coderSDKErr.StatusCode(), 404, "expected status code 404") - require.Equal(t, fmt.Sprintf("workspace %q does not exist", wsid), coderSDKErr.Message, "unexpected response code") + require.Equal(t, fmt.Sprintf("Workspace %q does not exist", wsid), coderSDKErr.Message, "unexpected response code") }) }