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") }) } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy